java List 排序 Collections.sort() 对 List 排序

Collections.sort()有两种策略:一种是让集合元素本身实现Comparable接口,另一种是使用用户提供的比较器(即Comparator)。

实体类:

public class User {
 String name;
 String age;
 public String getAge() {
  return age;
 }
 public void setAge(String age) {
  this.age = age;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 } 
}

使用第一种策略时,必须修改元素类的定义,让它实现Comparable,因此,你必须把User 类修改为:

public class User implements Comparable<User > {    
    public int compareTo(User another) {
        return getAge() - another.getAge();
    }    
    // 其余部分不变
}

说明一下,因为compareTo()方法约定:本对象大于另一个对象时,返回大于0的整数,小于时返回小于0的整数,等于时返回0。所以,可以直接返回两者年龄的差,来实现按年龄比较。这样就可以在main()方法中使用Collections.sort(listUser);来对员工按年龄排序了。但是,这种排序是非常不灵活的:第一,需要修改集合元素类User ,而很多情况下,我们没有办法修改公共的类。第二,没有办法实现多种方式排序,如按编号,按姓名,按薪水等等。这时需要使用另一种策略,即Comparator。Comparator使用其compare()方法返回的整数来比较两个对象,规则和compareTo()一样。如同样实现年龄比较,使用Comparator时,无需修改Employee类,可以在排序的时候定义相应的比较器。使用Collections.sort()方法的另一个版本:

Collections.sort(listUser,new Comparator<User>(){
public int compare(User arg0, User arg1) {  
return arg0.getAge().compareTo(arg1.getAge()); 

                //return arg0.getAge() - arg1.getAge();

}
});

这里使用了匿名内部类,实际上相当于先定义一个比较器类,如:

class UserComparator implements Comparator<User> {    
     public int compare(User arg0, User arg1) {
             return arg0.getAge().compareTo(arg1.getAge()); 

             //return arg0.getAge() - arg1.getAge();
     }
}

再使用:
Collections.sort(listUser, new UserComparator ());
可以看到,比较器完全独立于元素类User,因此可以非常方便地修改排序规则。你还可以定义一系列比较器,供排序时选择使用。


使用Comparator时,元素类无需实现Comparable,因此我们保持最初版本的User,但实际应用中,可以用Comparable的compareTo()方法来定义默认排序方式,用Comparator定义其他排序方式。实现其compare(T o1,T o2)有一个约定,就是 a.compare(b) == 0 和a.equals(b)要有相同的boolean结果。





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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值