作者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