从0开始学Java,打卡第10天(20输出式学习计划)-6TreeSet的自然排序、定制排序

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实现自然排序,没这样干的。如果真这样干了,默认是按照定制排序来的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值