1、comparator簡介:
comparator是javase中的接口,位於java.util包下。
2、功能
comparator接口代表一個比較器,比較器具有可比性。
javase一些使用到Comparator接口的地方:
Arrays.sort(T[],Comparator<? super T> c);
Collections.sort(List<T> list,Comparator<? super T> c);
3、comparator使用場景
排序:需要比較兩個對象誰排在前誰排在後(排序也可以讓類實現Comparable接口,實現後該類的實例也具有排序能力)。
分組:需要比較兩個對象是否是屬於同一組。
舉例:
排序
在List或數組中的對象如果沒有實現Comparable接口時,那麼就需要調用者爲需要排序的數組或List設定一個Compartor,Compartor的compare方法用來告訴代碼應該怎麼去比較兩個實例,然後根據比較結果進行排序:
talk is cheap show me the code
package com.java.demo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* @author puyf
*/
public class SortTest {
class Dog{
public int age;
public String name;
public Dog(int age, String name) {
super();
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Dog [age=" + age + ", name=" + name + "]";
}
}
public static void main(String[] args) {
List<Dog> list= new ArrayList<>();
list.add(new SortTest().new Dog(5, "DogA"));
list.add(new SortTest().new Dog(6, "DogB"));
list.add(new SortTest().new Dog(7, "DogC"));
Collections.sort(list, new Comparator<Dog>() {
@Override
public int compare(Dog o1, Dog o2) {
return o2.age - o1.age;
}
});
System.out.println("給狗狗按照年齡倒序:"+list);
Collections.sort(list, new Comparator<Dog>() {
@Override
public int compare(Dog o1, Dog o2) {
return o1.name.compareTo(o2.name);
}
});
System.out.println("給狗狗按名字字母順序排序:"+list);
}
}
4、總結
一般需要做比較的邏輯都可以使用的上Comparator,最常用的場景就是排序和分組,排序常使用Arrays和Collections的sort方法,而分組則可以使用上面提供的divider方法。
排序和分組的區別在於:
排序時,兩個對象比較的結果有三種:大於,等於,小於。
分組時,兩個對象比較的結果只有兩種:等於(兩個對象屬於同一組),不等於(兩個對象屬於不同組)