Java中Comparator与Comparable排序的区别详解
作者:霸道流氓气质
这篇文章主要介绍了Java中Comparator与Comparable排序的区别详解,如果你有一个类,希望支持同类型的自定义比较策略,可以实现接口Comparable,如果某个类,没有实现Comparable,但是又希望对它进行比较,则可以自定义一个Comparator,需要的朋友可以参考下
场景
java中进行排序比较时Comparator与Comparable区别:
如果你有一个类,希望支持同类型的自定义比较策略,可以实现接口Comparable
如果某个类,没有实现Comparable,但是又希望对它进行比较,则可以自定义一个Comparator,来定义这个类的比较规则
使用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));
到此这篇关于Java中Comparator与Comparable排序的区别详解的文章就介绍到这了,更多相关Comparator与Comparable区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!