作者TonyQ (骨頭)
站內java
標題Re: [問題] class變數存取問題
時間Wed Mar 15 18:19:29 2006
<站內>
※ 引述《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