Comparator篇

 1 import java.util.Arrays;
 2 import java.util.Comparator;
 3 
 4 public class UserComparator {
 5 
 6     public static void main(String[] args) {
 7 
 8         /**
 9          * Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足要求时,可写一个比较器来完成两个对象之间大小的比较。
10          * Comparator体现了一种策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。
11          *
12          */
13 
14         // 一组数字需要对其进行正序排序,java8之前我们通常的做法是:
15         Integer[] values1 = new Integer[]{1, 0, 3, 5, 7, 8, 5, 4, 3, 7, 9, 56, 3, 23};
16         Arrays.sort(values1, new Comparator<Integer>() {
17             @Override
18             public int compare(Integer value1, Integer value2) {
19                 return value1 - value2;
20             }
21         });
22         // 而在java8中,由于新增lambda表达式,我们可以很简洁的使用如下的方式:
23         Integer[] values2 = new Integer[]{1, 0, 3, 5, 7, 8, 5, 4, 3, 7, 9, 56, 3, 23};
24         Arrays.sort(values2, (x, y) -> x - y);
25         // jdk甚至为了排序做了一些定制的方法,比如上面的代码可以写成如下的方式,更加让人容易理解:
26         Integer[] values3 = new Integer[]{1, 0, 3, 5, 7, 8, 5, 4, 3, 7, 9, 56, 3, 23};
27         Arrays.sort(values3, Comparator.comparingInt(x -> x));
28 
29 
30         // reversed():这个方法是用来生成一个逆序器,比如我们开始需要得到一个正序的排序序列,然后又想得到一个反转的排序序列,就可以使用该方法
31         Integer[] values = new Integer[]{1, 0, 3, 5, 7, 8, 5, 4, 3, 7, 9, 56, 3, 23};
32         Comparator<Integer> comparator = Comparator.comparingInt(x -> x);
33         Arrays.sort(values, comparator);
34         System.out.println(JSON.toJSONString(values));  // [0,1,3,3,3,4,5,5,7,7,8,9,23,56]
35         Arrays.sort(values, comparator.reversed());
36         System.out.println(JSON.toJSONString(values));  // [56,23,9,8,7,7,5,5,4,3,3,3,1,0]
37 
38 
39         // thenComparing(Comparator<? super T> other):该方法是在原有的比较器上再加入一个比较器,比如我们有一些用户,在对其进行排序的时候,
40         // 我们首先对他的名字长度进行排序,然后再对他的年龄进行排序
41         Person[] persons = new Person[]{
42                 new Person(22, "zhangsan"),
43                 new Person(23, "lisi"),
44                 new Person(23, "wangwu"),
45                 new Person(22, "wangwu"),
46                 new Person(22, "lisi"),
47                 new Person(23, "zhangsan")
48         };
49         System.out.println(JSON.toJSONString(persons));
50         Comparator<Person> comparator = Comparator.comparingInt(x -> x.getName().length());
51         Arrays.sort(persons, comparator);
52         System.out.println(JSON.toJSONString(persons));
53         comparator = comparator.thenComparing(Comparator.comparingInt(Person::getAge));
54         Arrays.sort(persons, comparator);
55         System.out.println(JSON.toJSONString(persons));
56         // 输出结果如下:
57 //        [{"age":22,"name":"zhangsan"},{"age":23,"name":"lisi"},{"age":23,"name":"wangwu"},{"age":22,"name":"wangwu"},{"age":22,"name":"lisi"},{"age":23,"name":"zhangsan"}]
58 //        [{"age":23,"name":"lisi"},{"age":22,"name":"lisi"},{"age":23,"name":"wangwu"},{"age":22,"name":"wangwu"},{"age":22,"name":"zhangsan"},{"age":23,"name":"zhangsan"}]
59 //        [{"age":22,"name":"lisi"},{"age":23,"name":"lisi"},{"age":22,"name":"wangwu"},{"age":23,"name":"wangwu"},{"age":22,"name":"zhangsan"},{"age":23,"name":"zhangsan"}]
60 
61         // 简化写法如下:
62         Comparator<Person> comparator = Comparator.comparing(Person::getName).thenComparing(Person::getAge);
63         Arrays.sort(persons, comparator);
64     }
65 }

 

posted @ 2020-07-24 16:21  为你编程  阅读(189)  评论(0)    收藏  举报