集合框架(五)使用Comparable介面和Comparator介面來比較元素
1、有時希望將元素插入到一個樹集合中個,這些元素可能不是java.lang.Comparable的例項,這時可以定義一個比較器來比較這些元素。即需要建立一個實現java.util.Comparator介面的類。Comparator介面有兩個方法:compare和equals。
public int compare(Object element1, Object element2)
如果element1小於element2,就返回一個負值;如果element1大於element2,就返回一個正值;若兩者相等,則返回0。
public boolean equals(Object element)
如果指定的物件也是一個比較器,並且與這個比較器具有相同的排序,則返回true。
2、雖然Object類中也定義了equals方法,所以即使在比較器類中沒有實現equals方法也不會出現編譯錯誤,不過,有時實現該方法可以提高執行效率,可以讓程式快速判斷兩個不同的比較器是否具有相同的排序。
3、通常對於比較器來說,實現Serializable是一個好主意,因為,它們可以被用作像TreeSet這樣的可序列化資料結構的排序方法。為了使資料結構能夠成功序列化,比較器必須實現Serializable介面。
GeometricObjcetComparator.java
import java.util.Comparator;
public class GeometricObjectComparator implement Comparator, java.io.Serializable{
public int compare(GeometricObject o1, GeometricObject o2){
double area1 = o1.getArea();
double area2 = o2.getArea();
if(area1 < area2)
return -1;
else if(area1 == area2)
return 0;
else
return 1;
}
}
演示如何使用Comparator介面對樹形集中的元素進行排序。
TestTreeSetWithComparator.java
import java.util.*;
public class TestTreeSetWithComparator{
public static void main(String[] args){
//Create a tree set for geometric objects using a comparator
Set set = new TreeSet(new GeometricObjectComparator());
set.add(new Rectangle(4, 5));
set.add(new Circle(40));
set.add(new Circle(40));
set.add(new Rectangle(4, 1));
//Display geometric objects in the tree set
System.out.println("A sorted set of geometric objects");
for(GeometricObject element: set)
System.out.println("area = " + element.getArea());
}
}
A sorted set of geometric objects
area = 4.0
area = 20.0
area = 5022.5482453669
Circle類和Rectangle類都是幾何類GeometricObject的子類
注意:Comparable用於比較實現Comparable的類的物件;Comparator用於比較沒有實現Comparable的類的物件。
為什麼能排序,跟你怎麼實現Comparator介面無關。之所以能排序,是因為TreeSet在存入元素的時候,會按照二叉樹的排序規則,將你要存入的元素和已存在的元素進行比較,而比較結果所依據的就是你傳入的實現了Comparator介面的匿名物件的compare方法。