TreeSet:
1向TreeSet中添加的元素必须是同一个类的。
2可以按照添加进集合中的元素的指定的顺序遍历(如String、包装类默认按照从小到大的顺序遍历。)
3当Person类没有实现Comparable接口时,当向TreeSet中添加Person对象时,报ClassCastException。String实现Comparable接口并重写了compareTo方法。当向TreeSet中添加Person类的对象时,依据此方法,确定按照哪个属性排列。
public int compareTo(Object o){
if(o instanceof Person){
Person p = (Person)o;
return this.name.compareTo(p.name);
}
return 0;
}
4.当向TreeSet中添加自定义类的对象时,有两种排序方法:①自然排序②定制排序
自然排序:
1.要求自定义类实现java.lang.Comparable接口并重写其compareTo(Object obj)的抽象方法,在此方法中,指明按照自定义类的哪个属性进行排序。
2.向TreeSet中添加元素时,首先按照compareTo()进行比较,一旦返回0,虽然仅是两个对象的此属性值相同,但是程序会认为这两个对象是相同的,进而后一个对象就不能添加进来。
3.先compareTo(),然后hashCode(),然后equals()。compareTo()时候若两个元素的类型不一致,则返回0。添加add元素的时候无法发现,在运行的时候才发现类型被限制了,后面讲泛型,在添加的时候就能判断出来。
compareTo()与hashCode()以及equals()三者保持一致!
public int compareTo(Object o){
if(o instanceof Person){
Person p = (Person)o;
int i = this.name.compareTo(p.name);
if(i == 0){
return this.name.compareTo(p.age);
}else{
return i;
}
}
return 0;
}
TreeSet的定制排序:
compareTo()与hashCode()以及equals()三者保持一致!所以Customer中要判断属性都要判断
1.创建一个实现了Comparator接口的类对象
Comparator com = new Comparator(){
//向TreeSet中添加Customer类的对象,在此compare()方法中,指明是按照Customer的哪个属性排序的。
public int compare(Object o1,Object o2){
if(o1 instanceof Customer && o2 instanceof Customer){
Customer c1 = (Customer)o1;
Customer c2 = (Customer)o2;
int i = c1.getId().compareTo(c2.getId());
if(i == 0){
return c1.getName().compareTo(c2.getName());
}else{
return i;
}
return 0;
}
};
2.将此对象作为形参传递给TreeSet的构造器中
TreeSet set = new TreeSet(com);//也可以把上面第一步的弄成匿名类对象直接放到这个形参里
3.向TreeSet中添加Comparator接口中的compare方法中涉及的类的对象。
set.add(new Customer(“AA”,1003));
set.add(new Customer(“BB”,1002));
set.add(new Customer(“GG”,1004));
set.add(new Customer(“CC”,1001));
set.add(new Customer(“DD”,1001));
for(Object str:set){
System.out.println(str);
}
注意:
不会将customer用定制排序后,将customer实现自然排序,没这样干的。如果真这样干了,默认是按照定制排序来的。