Java提供了只包含一个compareTo()方法的Comparable接口。这个方法可以个给两个对象排序。具体来说,它返回负数,0,正数来表明已经存在的对象小于,等于,大于输入对象。
Java提供了包含compare()和equals()两个方法的Comparator接口。compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。只有当输入参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true。
内部比较器(Comparable接口)
类实现Comparable接口可以使得类具备了比较性,必须实现接口的compareTo方法。在使用Collections.sort(List list)或者Array.sort(Object[] a)对对象集合进行排序的时候,就会根据对象自定义的排序方法排序。
外部比较器(Comparator接口)
类实现Comparator接口可以构建比较器,实现接口的compare方法。在使用Collections.sort(List list,Comparator<? super T> c)或者Arrays.sort(T[] a,Comparator<? super T>c)进行对集合排序的时候,就会根据比较器产生的顺序对集合或数组排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
/**
* 员工实体
* @author Sam
*
*/
public class Employee implements Comparable<Employee> {
private int id;// 员工编号
private double salary;// 员工薪资
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public Employee(int id, double salary) {
super();
this.id = id;
this.salary = salary;
}
// 为了输出方便,重写toString方法
@Override
public String toString() {
// 简单输出信息
return "id:"+ id + ",salary=" + salary;
}
// 比较此对象与指定对象的顺序
@Override
public int compareTo(Employee o) {
// 比较员工编号,如果此对象的编号大于、等于、小于指定对象,则返回1、0、-1
int result = this.id > o.id ? 1 : (this.id == o.id ? 0 : -1);
// 如果编号相等,则比较薪资
if (result == 0) {
// 比较员工薪资,如果此对象的薪资大于、等于、小于指定对象,则返回1、0、-1
result = this.salary > o.salary ? 1 : (this.salary == o.salary ? 0 : -1);
}
return result;
}
}
/**
* 测试两种比较器
* @author Sam
*
*/
public class TestEmployeeCompare {
/**
* @param args
*/
public static void main(String[] args) {
List<Employee> employees = new ArrayList<Employee>();
employees.add(new Employee(2, 5000));
employees.add(new Employee(1, 4500));
employees.add(new Employee(4, 3500));
employees.add(new Employee(5, 3000));
employees.add(new Employee(4, 4000));
// 内部比较器:要排序的对象要求实现了Comparable接口
Collections.sort(employees);
System.out.println("通过内部比较器实现:");
System.out.println(employees);
List<Employee> employees2 = new ArrayList<Employee>();
employees2.add(new Employee(2, 5000));
employees2.add(new Employee(1, 4500));
employees2.add(new Employee(4, 3500));
employees2.add(new Employee(5, 3000));
employees2.add(new Employee(4, 4000));
// 外部比较器:自定义类实现Comparator接口
Collections.sort(employees2, new EmployeeComparable());
System.out.println("通过外部比较器实现:");
System.out.println(employees2);
}
}
/**
* 自定义员工比较器
*
*/
class EmployeeComparable implements Comparator<Employee> {
@Override
public int compare(Employee o1, Employee o2) {
// 比较员工编号,如果此对象的编号大于、等于、小于指定对象,则返回1、0、-1
int result = o1.getId() > o2.getId() ? 1 : (o1.getId() == o2.getId() ? 0 : -1);
// 如果编号相等,则比较薪资
if (result == 0) {
// 比较员工薪资,如果此对象的薪资大于、等于、小于指定对象,则返回1、0、-1
result = o1.getSalary() > o2.getSalary() ? 1 : (o1.getSalary() == o2.getSalary() ? 0 : -1);
}
return result;
}
}
|
参考:https://blog.csdn.net/qq_36711757/article/details/80427064