助记:名词【
Comparator
(比较器)】作为参数传递,形容词【Comparable<?>
(可比较的)】需要去实现。
Comparator | Comparable | ||
---|---|---|---|
类型 | 供需要比较的类实现方法(内部比较) | 将其实现类作为参数(外部比较) | |
方法 | int compare(Person o1, Person o2) | int compareTo(Object o) | |
方法说明 | 第一个参数为基准,第二个是与之比较的元素 。 返回正数基准在后;返回负数基准在前。 | 本类为基准,参数为比较的元素 。 返回正数基准在后;返回负数基准在前 。 | |
返回值1 | 升序:基准 - 比较者(第一个 - 第二个) 升序: return o1.a - o2.a; | 升序:基准 - 比较者(第一个 - 第二个) 升序: return this.a - o.a; | |
返回值2 | 对于字符串(升序):return o1.getValue().compareTo(o2.getValue()); |
返回值2:
Collections.sort(list, new Comparator<Map.Entry<String, String>>() {
//升序排序,第一个o1为基准,第二个o2为被比较值;返回值中o1在o2前面,倒序反过来就可以了。
public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {
return o1.getValue().compareTo(o2.getValue());
}
});
总结:
正序:返回值时,基准放前面作为被减数;倒序:返回值时基准放后面作为减数,两个都是一样。如上面代码,调用字符串compareTo()方法也是一样的规律。
1. Comparator<?>
问号为要比较的集合元素
//1.比较的类
public class Person {
private int age;
private String name;
//get.set方法。。。。
}
//2. 实现Comparator<?>
public class PersonComparator implements Comparator<Person> {
// 第一个参数可以理解为基准,第二个是与之比较的元素 。返回负数表示排在其前面,返回正数表示排在其后面
@Override
public int compare(Person o1, Person o2) {
// 返回负数表示o1排在o2前面
if (o1.getAge() > o2.getAge()) {
return -1;
}
// 返回正数表示o1排在o2后面
if (o1.getAge() < o2.getAge()) {
return 1;
}
return 0;
}
}
2. Comparable<?>
问号为要比较的集合元素
public class Person implements Comparable<Person> {
private int age;
// ... get/set方法 ...
@Override
public int compareTo(Person comparedUser) {
// 返回负数表示this对象排在comparedUser前面
if (this.age > comparedUser.getAge()) {
return -1;
}
// 返回正数表示this对象排在comparedUser后面
if (this.age < comparedUser.getAge()) {
return 1;
}
return 0;
}
}