編寫你自己的Comparable類型
Comparable 介面由一個單一的方法構成:
public interface Comparable {
public int compareTo(Object o);
}
compareTo 方法將接收對象與特定對象進行比較,並在接收對象小於、等於或大於特定對象時分別返回負整數、空或一個正整數。如果特定對象不能與接收對象相比較,該方法扔出一個ClassCastException. 這是一個表示某人姓名的類(a class representing a person"s name), 它實現了 Comparable:
import java.util.*;
public class Name implements Comparable {
private String firstName, lastName;
public Name(String firstName, String lastName) {
if (firstName==null || lastName==null)
throw new NullPointerException();
this.firstName = firstName;
this.lastName = lastName;
}
public String firstName() {return firstName;}
public String lastName() {return lastName;}
public boolean equals(Object o) {
if (!(o instanceof Name))
return false;
Name n = (Name)o;
return n.firstName.equals(firstName) &&
n.lastName.equals(lastName);
}
public int hashCode() {
return 31*firstName.hashCode() + lastName.hashCode();
}
public String toString() {return firstName + " " + lastName;}
public int compareTo(Object o) {
Name n = (Name)o;
int lastCmp = lastName.compareTo(n.lastName);
return (lastCmp!=0 ? lastCmp :
firstName.compareTo(n.firstName));
}
}
為了使這個例子短一些,該類受到了一點限制:它不支援中間名,它要求必須同時具有first name 和 last name, 而這不是在全世界都通用的。儘管如此,這個例子仍有幾個重要之處:
Name 對象是不變的( immutable)。作為相等、不變類型的所有其它事情就是如何做的問題,特別是對那些將被用來作為 Sets 中的元素或 Maps 中的鍵的對象來說,更是如此。如果你對這些 對象集 中的元素或鍵做了更改,這些 對象集 將中斷。