这段代码相信会有帮助:
public class NewTest {
public static void main(String[] args) throws Exception {
TreeSet ts = new TreeSet(new MyComparator());
ts.add(new Parent("parent1"));
ts.add(new Child("child"));
ts.add(new Parent("parent2"));
System.out.println(ts);
for (Iterator it = ts.iterator(); it.hasNext();) {
Parent p = (Parent) it.next();
System.out.println(p.name);
}
}
}
class Parent {
public String name;
public Parent(String name) {
this.name = name;
}
}
class Child extends Parent {
public Child(String name) {
super(name);
}
}
class MyComparator implements Comparator {
public int compare(Object o1, Object o2) {
if (o1.getClass() == Child.class) { //通过查看o1的类型来了解到底哪个对象传递给了o1,哪个传递给了o2
System.out.println(o1.getClass().getName());
System.out.println(o2.getClass().getName());
return 1;
}
return -1;
}
}
我这里的打印结果为:
junit.test.Child
junit.test.Parent
[junit.test.Parent@19360e2, junit.test.Parent@bdb503, junit.test.Child@b6e39f]
parent2
parent1
child
程序中给集合传递了一个Child两个Parent,根据打印结果可以几个结论:
1.比较器的compare(Object o1,Object o2)方法在进行比较的时候,是把将要加入集合的对象作为o1,集合中原有的对象作为o2进行比较。
2.TreeSet集合中的元素永远是小的在前面,大的在后面(就是说compare返回-1,元素就往前放,返回1就往后放)
至于楼主的问题我认为是先比较再存入。因为TreeSet有顺序,如果先存入的话不进行比较那么该把它放在哪呢?
个人分析,不一定正确啊,大家一起讨论下。 |