要實現(xiàn)List進行排序我們看下API文檔
java.util:
Interface Collection,Interface Comparator
Class Collections
java.lang:
Interface Comparable
Class Collections中有個排序方法sort:
public static <T extends Comparable<? super T>> void sort(List<T> list)
這個方法申明說明了以下幾個內(nèi)容:
1.sort的入?yún)⑹荓ist
2.List中放入的類型是T
3.T是要實現(xiàn)了Comparable接口的類
4.Comparable的類型參數(shù)是T或者是T的父型
5.上面的Comparable是個接口说搅,為什么用extends 克伊?
以泛型的觀點來說哥放,extends這個關(guān)鍵詞代表的“是一個”且適用于類和接口
所有可以“排序”的類都實現(xiàn)了java.lang.Comparable接口。Comparable接口中只有一個方法羹幸,public int compareTo(Object obj): 該方法:
返回0,表示 this == obj
返回正數(shù)巧鸭,表示this > obj
返回負數(shù)涂召,表示 this < obj
實現(xiàn)了Comparable接口的類通過實現(xiàn)compareTo方法從而確定該類對象的排序方式。
該Name類實現(xiàn)了Comparable接口误澳,重寫compareTo方法
package mashibing.java;
public class Name implements Comparable<Name> {
private final 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;
}
@Override
public int compareTo(Name n) {
int lastCmp = lastName.compareTo(n.lastName);
return (lastCmp != 0 ? lastCmp : firstName.compareTo(n.firstName));
}
}
上面重寫的compareTo方法耻矮,接收一個Object類,強制將其轉(zhuǎn)換成Name類忆谓,先將lastName進行比較裆装,比較使用的是String類的重寫的compareTo方法下面展示的是String類別的compareTo方法,取了兩個長度值的最小值,依照次序來比較每個char的的值得大小倡缠,char中保存的是ACSII的值哨免,直到兩個字符的值不一樣,否則就返回兩個char字符的差值昙沦,如果在k大于兩個中的最小值的之前還沒有返回出來的一個值得話琢唾,那么就比較兩個長度的大小。
private final char value[];
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}
看下下面主程序盾饮,使用了Collections.sort(names)采桃,對names這個List進行了排序,這個List中的元素是Name類型的丘损,Name按照API的sort的要求實現(xiàn)了Comparable接口重寫了compareTo方法普办。所以可以對該List進行排序。
import java.util.*;
public class test {
public static void main(String[] args) {
Name nameArray[] = {
new Name("John", "Smith"),
new Name("Karl", "Ng"),
new Name("Jeff", "Smith"),
new Name("Tom", "Rich")
};
List<Name> names = Arrays.asList(nameArray);
Collections.sort(names);
System.out.println(names);
}
}