Re: [問題] class變數存取問題

看板java作者 (骨頭)時間19年前 (2006/03/15 17:19), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串11/17 (看更多)
<站內> ※ 引述《PsMonkey (痞子軍團團長)》之銘言: : ※ 引述《TonyQ (骨頭)》之銘言: : 我想問幾件事情 : 你的 "容器" 指的是? Java Collections Framework 裡的東西? 還是? : (畢竟一開始原 po 沒有說清楚,我也搞不清楚) 就是Collection裡的東西囉 可以容納資料的東西都可以算容器吧...XD : 撇開 "容器" 是啥不談 : (java.util.List 也沒有看到跟 Comparator 有關的東西) 事實上有用到排序的都會用到這東西XD ex. TreeSet & TreeMap : Comparator 也可以用在 Arrays.sort() 當中阿 : 我到是覺得那邊用起來比較實在... : (不知道哪裡還能用 Comparator 的... [遠目]) 目前為止看到的狀況 通常這都是拿來排序的 XD : TreeMap 為什麼要那樣子設計,我還有待研究 : (我就是沒用過啦,你是要怎樣... [翻桌]) : 但是,我覺得 Comparator 這種設計方法 : 是當有需要的時候,可以快速切換比較的方法 : 而不用去改程式碼 : 當你 class 當中 field 很多,又要分別拿來比的時候 : 就十分好用 : 舉個例子: : 模擬 Scheduler 的運作 : 我把 PCB 包成一個 class : 今天要挑一個 process 給 CPU 臨幸 XD : 如果要 FIFO,那就把 Ready State 的 PCB 們變成一個 Array : 然後 Arrays.sort(pcb, new InTimeComparator()) : 如果要 SJF,那只要改成 : Arrays.sort(pcb, new JobLengthComparator()) 就掰掰再見 : 而我在 PCB 這個 class 還是 implement Comparable : 但是比較的是 Process ID 是啊 是這樣沒錯 那我們的討論差不多就可以到這裡打個段落了吧XD ---------- 順便再提一件跟Java Collection有關, 很有趣的事情,我用簡短的程式碼舉例,XD 我先寫一個非implement Comparable的簡單物件。 假設我的目標是要把Person照著age排序並置入Set。 class Person{ int age; Person(int in){ age=in; } } ----------------------------------------------------------------- TreeSet<Person> ts=new TreeSet<Person>(); 因為TreeSet是會把資料排序的容器,放資料的時候就會進行比較的動作。 此時給它下列的敘述, ts.add(new Person(5)); //此時只有一筆資料 不需比較 ts.add(new Person(2)); //此時因為找不到compare,所以產生java.lang.ClassCastException: ----------------------------------------------------------------- <解一> 這是因為Person並沒有implement Comparable的關係,如果 Person也去implement Comparable就可以解決了。 比方說在Person內加上類似這段程式碼這樣的東西就ok了 這是透過改變instant的方式去解決問題 public int compareTo(Object p){ if( age>((Person)p).age) return 1; else if(age==((Person)p).age) return 0; else return -1; } ----------------------------------------------------------------- <解二> 那我就告訴我的Set處理到這種Class的時候,用另一種比較方法, 其他的還是用本來的方法~~(透過Comparator) 這是透過容器去解決問題, (謎之音:這哪裡簡短了? (淚) 我發現用我的概念我要用好多行才寫的出範例(再淚)) 底下的範例是透過Comparator去讓 Person跟Object可以溝通... TreeSet ts=new TreeSet( new Comparator(){ public boolean equals(Object obj){ return false; } public int compare(Object o1, Object o2) { if(o1 instanceof Person && o2 instanceof Person){ return (""+((Person)o1).age).compareTo(""+((Person)o2).age); }else if(o1 instanceof Person){ return (""+((Person)o1).age).compareTo(o2.toString()); }else if(o2 instanceof Person){ return o1.toString().compareTo(""+((Person)o2).age); }else { return o1.toString().compareTo(o2.toString()); } } } ); for(int i=0;i<10;i+=2){ ts.add(new Person(i)); } for(int i=1;i<10;i+=2) ts.add("hi"+i); Iterator ir=ts.iterator(); while(ir.hasNext()){ Object t=ir.next(); if(t instanceof Person) System.out.println(((Person)t).age); else System.out.println(t); } ----------------------------------------------------------------- -- Local 學識不足,連寫個範例都捉襟見軸,看來我真的該去好好進修了XD TreeSet Default的Comparator規則到底是甚麼啊 可惡 剛剛翻半天文件 翻不到只好蠻力硬幹XD 意思到就好啦 別鞭太兇狠啊XD 要趕著出門去參加校隊練球了掰~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.138.240.58
文章代碼(AID): #145zmPIv (java)
討論串 (同標題文章)
文章代碼(AID): #145zmPIv (java)