-
Comparator与Comparable
-
如果有一个类,希望支持同类型的自定义比较策略,可以实现接口Compareable
-
如果某个类,没有实现Compareable接口,但是又希望对他进行比较,则可以自定义一个Comparator,来定义这个类的比较规则
-
java">public static class People implements Comparable<People>{int code;int age;public people(int code,int age){this.code = code;this.age = age;}@Overridepublic int compareTo(People p){if(code == p.code){return 0;}else if(code < p.code){return -1;}else{return 1;}} }
-
People类实现了Comparable接口,因此可以直接调用list.sort(null)或者CollectionUtils.sort(list)来进行比较,如果希望实现针对people类的age字段,进行升序排列,那么可以使用Comparator来实现
-
java">@Test public void testDemoSort(){List<People> list = new ArrayList<>();list.add(new People(10,30));list.add(new People(12,10));list.add(new People(11,20));//默认根据code进行升序比较list.sort(null);list.sort(new Comparator<People>(){@Overridepublic int compare(People p1,People p2){if(p1.age == p2.age){return 0;}else if(p1.age < p2.age){return -1;}else{return 1;}}}); }
-
简洁实现,但是有致命问题,可能会溢出
-
java">list.sort(new Comparator<People>{@Overridepublic int compare(People p1,People p2){return p1.age - p2.age;} });
-
-
使用基础类的compare方式,防止溢出
-
java">list.sort(new Comparator<People>(){@Overridepublic int compare(People p1,People p2){return Integer.compare(p1.age,p2.age);} });
-
java">//在1.8中,可以简化: list.sort(Comparator.comparingInt(p->p.age));
-
-
倒序排列
-
调换位置
-
java">list.sort(new Comparator<People>(){@Overridepublic int compare(People p1,People p2){return Integer.compare(p2.age,p1.age);} });
-
-
jdk1.8使用负数
-
java">list.sort(Comparator.comparingInt(p->-p.age));
-
-
-