Comparator 与 Comparable
一、Comparable
該接口強調對實現它的每個類的對象進行整體排序。這種排序被稱為類的自然排序,類的 compareTo 方法被稱為它的自然比較方法。實現此接口的對象列表(和數組)可以通過 Collections.sort(和 Arrays.sort)進行自動排序。實現此接口的對象可以用作有序映射(如 TreeMap)中的鍵或有序集合(如 TreeSet)中的元素,無需指定比較器。
該接口只有一個方法:
int compareTo(T o)
比較此對象與指定對象的順序。
int compareTo(T o) :如果該對象小于、等于或大于指定對象,則分別返回負整數、零或正整數。 注意:此類具有與 equals 不一致的自然排序。
二、Comparator
強調對某個對象 collection 進行整體排序 的比較函數。可以將 Comparator 傳遞給 sort 方法(如 Collections.sort 或 Arrays.sort),從而允許在排序順序上實現精確控制。還可以使用 Comparator 來控制某些數據結構(如有序 set或有序映射)的順序,或者為那些沒有自然順序的對象 collection(List等) 提供排序。
該接口只有兩個個方法:
int compare(T o1, T o2)
比較用來排序的兩個參數。
boolean equals(Object obj)
指示某個其他對象是否“等于”此 Comparator。
int compare(T o1, T o2): 比較用來排序的兩個參數。根據第一個參數小于、等于或大于第二個參數分別返回負整數、零或正整數。注意:此 Comparator 強行進行與 equals 不一致的排序。
注意,不重寫 Object.equals(Object) 方法總是 安全的[因為任何類,默認都是已經繼承了Object 超類,在Object 已經實現了該方法]。然而,在某些情況下,重寫此方法可以允許程序確定兩個不同的 Comparator 是否強行實施了相同的排序,從而提高性能。
三、具體例子
下面就來做一個例子通過上面兩個接口的實現對一個集合內對象的num 進行升序排列輸出,當num 相同時則按照type 的字典序進行排序。
Comparable 實現:
import java.util.*;public class ComparableTest {public static void main(String[] args) {List<Fruit> list = new ArrayList<>();list.add(new Fruit("Apple",10));list.add(new Fruit("Orange",8));list.add(new Fruit("Banana",15));list.add(new Fruit("Strawberry ",7));list.add(new Fruit("Pear",7));Collections.sort(list); // 如果是set 的集合或者 Map,不用指定Collections.sort() 排序Iterator<Fruit> iterator = list.iterator();System.out.println("排序后........");while (iterator.hasNext()){System.out.println(iterator.next());}} }class Fruit implements Comparable<Fruit>{private String type;private int num;public Fruit(String type , int num){this.type = type;this.num = num;}@Overridepublic int compareTo(Fruit fruit) {int tmp = this.num - fruit.num;return tmp != 0 ? tmp : this.type.compareTo(fruit.type);}@Overridepublic String toString() {return type + ":" + num;} }輸出
排序后……..
Pear:7
Strawberry :7
Orange:8
Apple:10
Banana:15
Comparator實現:
import java.util.*;public class ComparatorTest {public static void main(String[] args) {List<Animal> list = new ArrayList<>();list.add(new Animal("Dog",10));list.add(new Animal("Cat",8));list.add(new Animal("Tiger",15));list.add(new Animal("Panda ",7));list.add(new Animal("Lion",7));Collections.sort(list,new Sort());Iterator<Animal> iterator = list.iterator();System.out.println("排序后........");while (iterator.hasNext()){System.out.println(iterator.next());}} }class Sort implements Comparator<Animal>{@Overridepublic int compare(Animal animal1, Animal animal2) {int tmp1 = animal1.getNum() - animal2.getNum();int tmp2 = animal1.getType().compareTo(animal2.getType());return tmp1 != 0 ? tmp1 : tmp2;} }class Animal{private String type;private int num;Animal(String type , int num){this.type = type;this.num = num;}/** 省略 set、get 與 toString() 方法 */ }輸出
排序后……..
Lion:7
Panda :7
Cat:8
Dog:10
Tiger:15
四、總結
因此一個集合要想實現排序可以用上面兩種方法
1:讓元素自身具備比較功能,需要實現Comparable接口,覆蓋compare()方法
2:讓集合自身具備比較功能,定義一個類實現Comparator接口,實現compare 方法將該類的對象返回給集合的構造函數
總結
以上是生活随笔為你收集整理的Comparator 与 Comparable的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 法国正规雇佣兵退役后法国发生战争会被召回
- 下一篇: 古代朝鲜王出行的场面是什么