Comparator
最近在公司写接口的时候遇到一个对List<Map>的排序处理。排序的依据是map里面的“DJRQ”这个键所对应的值的大小,一开始我想的是用冒泡排序甚至快速排序去做,后来看到有个类似的用外部比较器Comparator去做。看起来感觉很方便就用了,顺便复习一下,一下是我实践的代码:
public static void ListMapSort(List<Map<String,String>> list){
Collections.sort(list, new Comparator<Map>() {
@Override
public int compare(Map o1, Map o2){
try{
//日期格式比较大小是通过getTime方法返回的结果进行比较
if(o1.get("DJRQ").getTime() > o2.get("DJRQ").getTime()){
return -1;
}else if(o1.get("DJRQ").getTime() > o2.get("DJRQ").getTime()){
return 1;
}else{
return 0;
}
}catch (Exception ex){
}
return 0;
}
}
}
该方法首先调用的是Collection工具类的其中的一个sort方法,这里的sort方法需要两个参数,一个是待排序的List,另一个是排序规则,也就是外部比较器Comparator,当你创建这个外部比较器的时候,他会有个compare方法让你去写排序逻辑。这样,一个根据 ”DJRQ“的值进行降序的排序方法就已经写出来了。
Comparable
假设一个这样的应用场景:需要对一个List<People>进行排序,排序规则是根据People对象里面的age字段的值进行升序。一下是代码
public class People implements Comparable {
int age;
@Override
public int compareTo(Object o){
People p = (People)o;
return this.age - people.getAge();
}
....此处省略get、set以及构造方法
//下面是main方法测试
public staic void main(String[] args){
//先构造一个List<People>
People p1 = new People(2);
People p1 = new People(1);
People p1 = new People(3);
List<People> list = new ArrayList<>();
list.add(p1);list.add(p2);list.add(p3);
//调用Collections的sort方法
Conllections.sort(list);
//控制台输出结果测试
for(int i = 0; i < list.size(); i++){
System.out.println(list.get(i).getAge());
}
}
}
这里使用的是Collections的sort方法来对List<People>进行排序,和上面sort是重载关系。要想调用这个sort方法的List得具备一个条件就是,List里面存的对象得实现Comparable接口。这里,People对象实现了Comparable接口,要实现的方法就是compareTo方法,也就是排序规则,这里的排序规则是升序,如果想要降序的话,把减号前后的对象位置互换即可。
总结
我们可以对实现了Comparable接口(内部比较器)的对象列表进行排序,通过Collecations的sort方法。
我们可以下写个外部比较器Comparator来对对象列表进行排序,通过Collections的sort方法。
这两个sort方法是重载关系,参数不一样。