Comparator和Comparable比較:
| 參數(shù) | Comparable | Comparator |
|---|---|---|
| 排序邏輯 | 排序邏輯必須在待排序?qū)ο蟮念愔?,故稱之為自然排序 | 排序邏輯在另一個(gè)實(shí)現(xiàn) |
| 實(shí)現(xiàn) | 實(shí)現(xiàn)Comparable接口 | 實(shí)現(xiàn)Comparator接口 |
| 排序方法 | int compareTo(Object o1) |
int compare(Object o1,Object o2) |
| 觸發(fā)排序 | Collections.sort(List) | Collections.sort(List, Comparator) |
| 接口所在包 | java.lang.Comparable |
java.util.Comparator |
Comparable接口:
- Comparable接口可以認(rèn)為是一個(gè)內(nèi)部比較器;
- 該接口對(duì)每個(gè)實(shí)現(xiàn)它的類的對(duì)象強(qiáng)加了排序規(guī)則,該排序稱為自然排序,方法
public int compareTo(T o)是自然排序的排序方法; - 如果開發(fā)者add進(jìn)入一個(gè)Collection的對(duì)象想要Collections的sort方法幫你自動(dòng)進(jìn)行排序的話,那么這個(gè)對(duì)象必須實(shí)現(xiàn)Comparable接口。compareTo方法的返回值是int,有三種情況:
1、比較者大于被比較者(也就是compareTo方法里面的對(duì)象),那么返回正整數(shù)
2、比較者等于被比較者,那么返回0
3、比較者小于被比較者,那么返回負(fù)整數(shù) - 實(shí)現(xiàn)Comparable接口的實(shí)體:實(shí)例Person以姓名升序排序,若姓名一樣則按照年齡排序
public class Person implements Comparable {
private String name;
private Integer age;
private String mind;
//省略getter 和 setter方法、構(gòu)造函數(shù)、toString函數(shù)
@Override
public int compareTo(Object o) {
Person targetPerson = (Person)o;
int ret = this.name.compareTo(targetPerson.getName());
if(ret == 0){
return Integer.compare(this.age,targetPerson.getAge());
}
if(ret == 0){
return this.getMind().compareTo(targetPerson.getMind());
}
return ret;
}
}
Comparator接口:
- Comparator可以認(rèn)為是是一個(gè)外比較器;
- JDK的大量的類包括常見的 String、Byte、Char、Date等都實(shí)現(xiàn)了Comparable接口;
- Comparator接口里面有一個(gè)compare方法,方法有兩個(gè)參數(shù)T o1和T o2,是泛型的表示方式,分別表示待比較的兩個(gè)對(duì)象,方法返回值和Comparable接口一樣是int,有三種情況:
1、o1大于o2,返回正整數(shù)
2、o1等于o2,返回0
3、o1小于o2,返回負(fù)整數(shù) - 實(shí)現(xiàn)Comparator接口的實(shí)體:實(shí)例Person以姓名升序排序,若姓名一樣則按照年齡排序
public class PersonComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
//使用到了Person類中的compareTo方法進(jìn)行比較
//若Person沒實(shí)現(xiàn)Comparable接口,也可以自行比較
int ret = p1.getName().compareTo(p2.getName());
if(ret == 0){
return p1.getAge().compareTo(p2.getAge());
}
return ret;
}
}
測試比較:
public class Test {
public static void main(String[] args){
//生成數(shù)據(jù)
List<Person> personList1 = generatePersonList();
List<Person> personList2 = generatePersonList();
//排序一:
Collections.sort(personList1);
print("Collections.sort(list)",personList1);
//排序二
PersonComparator pc = new PersonComparator();
//PersonComparator2 pc2 = new PersonComparator2();
Collections.sort(personList2,pc.thenComparing(pc));
print("thenComparing",personList2);
}
//生成待排序數(shù)組
private static List<Person> generatePersonList() {
List<Person> retList = new ArrayList<>(16);
retList.addAll(
Arrays.asList(
new Person[]{
new Person("erMaZi", 19, "good"),
new Person("wangWu", 18, "middle"),
new Person("liSi", 17, "bad"),
new Person("wangWu", 16, "middla"),
}
)
);
return retList;
}
public static void print(String message,List<Person> personList){
System.out.println(message+":");
for(Person p:personList){
System.out.println(p);
}
System.out.println();
}
}
jdk官方默認(rèn)排序:
- 升序
< return -1
= return 0
> return 1
- 降序
< return 1
= return 0
> return -1