今天去东莞出差一天,累死了,最近由于要给毕设准备实验数据,开始做一些电池测试的实验,都没什么写代码的时间了,蛋疼。
进入主题
List的排序主要通过两种方法:
1. 使要排序的对象实现Comparable接口
2. 自定义一个比较器(Comparator),然后调用Collection的sort()方法
有一个核心点要明白,不管那种比较方式,其实最终都是调用了jre中已经存在的类型的比较方法。什么意思呢?假如有一个User类,我想按姓名排序,其实核心是调用了String的compareTo()方法。而String类的compareTo()方法是怎么实现的呢,经过查看源码发现是使用native方法实现的。
明白了这一点之后,我们来看看这两种方法分别是怎么实现的。
1. model实现Comparable接口
public class User implements Comparable<User>{
private int id;
private String name;
private String amArrangement;
private String pmArrangement;
private boolean isTop;
//java bean 略
@Override
public int compareTo(@NonNull User user) {
return this.name.compareTo(user.getName());
// return user.getName().compareTo(this.name);//如果这样写顺序就会反过来
}
}
// 排序.注意是Collections不是Collection
Collections.sort(userList);
2. 使用比较器
public class StringComparator implements Comparator<User> {
@Override
public int compare(User user1, User user2) {
return user1.getName().compareTo(user2.getName());
}
}
// 排序
Collections.sort(userList, new StringComparator());
两种方法的比较
相对而言我更喜欢第二种方式,更加灵活,可以动态改变排序的方式,而第一种一旦写好之后就只有一种排序方式了。同时我个人认为排序的方式并不属于model应该完成的任务,第二种方式更加符合软件设计的责任链模式。