场景
java中进行排序比较时Comparator与Comparable区别:
如果你有一个类,希望支持同类型的自定义比较策略,可以实现接口Comparable
如果某个类,没有实现Comparable,但是又希望对它进行比较,则可以自定义一个Comparator,来定义这个类的比较规则
注:
博客:
霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主
使用Comparable进行排序比较
新建类CompareDemo,并添加code和age属性,该类实现Comparable接口
并重新compareTo方法
public class CompareDemo implements Comparable<CompareDemo>{
int code;
int age;
public CompareDemo(int code, int age) {
this.code = code;
this.age = age;
}
@Override
public int compareTo(CompareDemo o) {
if(code == o.code){
return 0;
}else if(code<o.code){
return -1;
}else{
return 0;
}
}
}
进行排序比较,默认根据code进行升序比较
List<CompareDemo> list = new ArrayList<CompareDemo>(){
{
add(new CompareDemo(10,20));
add(new CompareDemo(12,30));
add(new CompareDemo(11,10));
}};
list.forEach(compareDemo -> System.out.println(compareDemo.code));
//默认根据code进行升序比较
list.sort(null);
list.forEach(compareDemo -> System.out.println(compareDemo.code));
如果现在需求变了,希望针对age字段,进行升序排序,那么就可以利用Comparator实现。
使用Comparator进行排序
list.sort(new Comparator<CompareDemo>() {
@Override
public int compare(CompareDemo o1, CompareDemo o2) {
if (o1.age == o2.age) {
return 0;
} else if (o1.age < o2.age) {
return -1;
} else {
return 1;
}
}
});
list.forEach(compareDemo -> System.out.println(compareDemo.age));
上面的排序可以简化为
list.sort(new Comparator<CompareDemo>() {
@Override
public int compare(CompareDemo o1, CompareDemo o2) {
return Integer.compare(o1.age,o2.age);
}
});
在JDK1.8中还可以更简化
list.sort(Comparator.comparingInt(o -> o.age));
如果希望倒序
list.sort(new Comparator<CompareDemo>() {
@Override
public int compare(CompareDemo o1, CompareDemo o2) {
return Integer.compare(o2.age,o1.age);
}
});
在jdk1.8中,使用负数
list.sort(Comparator.comparingInt(o->-o.age));
list.forEach(compareDemo -> System.out.println(compareDemo.age));