实现Comparator接口是一种很好的比较方式,Comparator体现了一种策略模式,
即可以不用要把比较方法嵌入到类中,而是单独在类外部使用,
这样我们就可有不用改变类本身的代码而实现对类对象进行排序,这样可以降低耦合度。
使用lambda表达式来实现Comparator可以使代码看起来更简洁。
1 import java.util.ArrayList;
2 import java.util.Collections;
3 import java.util.Comparator;
4 import java.util.List;
5
6 public class LearnComparator {
7 /**
8 * Entity*/
9 static class User{
10
11 String name;
12 int age;
13 int money;
14
15 public int getMoney() {
16 return money;
17 }
18
19 public void setMoney(int money) {
20 this.money = money;
21 }
22
23 public User(String name, int age) {
24 this.name = name;
25 this.age = age;
26 }
27 public User(String name, int age, int money) {
28 this.name = name;
29 this.age = age;
30 this.money = money;
31 }
32
33 public String getName() {
34 return name;
35 }
36
37 public void setName(String name) {
38 this.name = name;
39 }
40
41 public int getAge() {
42 return age;
43 }
44
45 public void setAge(int age) {
46 this.age = age;
47 }
48 }
49
50 /**
51 * define the specified comparator, compared by User's name
52 * implements compare() method*/
53 static class NameComparator implements Comparator<User>{
54 public int compare(User u1,User u2){
55 return u1.getName().compareTo(u2.getName());
56 }
57 }
58
59 /**
60 * define another specified comparator, compared by User's age*/
61 static class AgeComparator implements Comparator<User>{
62 public int compare(User u1,User u2){
63 return u1.getAge()-u2.getAge();
64 }
65 }
66
67 public static void main(String[] args) {
68 List<User> list = new ArrayList<>();
69 list.add(new User("Henry",21,100));
70 list.add(new User("Jerry",22,300));
71 list.add(new User("Tom",18,200));
72 list.add(new User("Bill",19,50));
73 for(User u : list){
74 System.out.println(u.getName());
75 }
76
77 Collections.sort(list,new NameComparator());//sort by name
78
79 for(User u : list){
80 System.out.println(u.getName());
81 }
82 for(User u : list){
83 System.out.println(u.getAge());
84 }
85
86 Collections.sort(list,new AgeComparator());//sort by age
87
88 for(User u : list){
89 System.out.println(u.getAge());
90 }
91
92 for(User u : list){
93 System.out.println(u.getMoney());
94 }
95
96 /**
97 * We can also use lambda expression to implements comparator
98 * */
99 Collections.sort(list,(u1,u2) -> (u1.getMoney()-u2.getMoney()));
100
101 for(User u : list){
102 System.out.println(u.getMoney());
103 }
104 }
105 }