1.什么是Comparable接口
此接口強行對實現它的每個類的對象進行整體排序。此排序被稱為該類的自然排序 ,類的 compareTo 方法被稱為它的自然比較方法 。實現此接口的對象列表(和數組)可以通過 Collections.sort (和 Arrays.sort )進行自動排序。實現此接口的對象可以用作有序映射表中的鍵或有序集合中的元素,無需指定比較器。 強烈推薦(雖然不是必需的)使自然排序與 equals 一致。所謂與equals一致是指對於類 C 的每一個 e1和 e2 來說,當且僅當 (e1.compareTo((Object)e2) == 0) 與e1.equals((Object)e2) 具有相同的布爾值時,類 C 的自然排序才叫做與 equals 一致 。
2.實現什么方法
int compareTo(T o) 比較此對象與指定對象的順序。如果該對象小於、等於或大於指定對象,則分別返回負整數、零或正整數。
強烈推薦 (x.compareTo(y)==0) == (x.equals(y)) 這種做法,但不是 嚴格要求這樣做。一般來說,任何實現 Comparable 接口和違背此條件的類都應該清楚地指出這一事實。推薦如此闡述:“注意:此類具有與 equals 不一致的自然排序。”
參數: o - 要比較的對象。 返回:
負整數、零或正整數,根據此對象是小於、等於還是大於指定對象。 拋出:
ClassCastException - 如果指定對象的類型不允許它與此對象進行比較。
3.實例
package test1; public class Note<T> implements Comparable<Note<T>> { private T data; //數據 private int weight; //權值 private Note<T> left; //左孩子 private Note<T> right; //右孩子 public Note(T data,int weight){ this.data=data; this.weight=weight; } @Override public String toString(){ return "data="+this.data+",weitht="+this.weight; } public T getData() { return data; } public void setData(T data) { this.data = data; } public int getWeight() { return weight; } public void setWeight(int weight) { this.weight = weight; } public Note<T> getLeft() { return left; } public void setLeft(Note<T> left) { this.left = left; } public Note<T> getRight() { return right; } public void setRight(Note<T> right) { this.right = right; } /** * 倒序排列。 */ @Override public int compareTo(Note<T> o) { if(o.weight>this.weight){ return 1; }else if(o.weight<this.weight){ return -1; } return 0; } /** * 升序排列 */ // @Override // public int compareTo(Note<T> o){ // if(this.weight>o.weight){ // return 1; // }else if(this.weight<o.weight){ // return -1; // } // return 0; // }
Ps:(快速記憶法)當前對象與后一個對象進行比較,如果比較結果為1進行交換,其他不進行交換。
當后一個對象比當前對象大,返回結果值為1時,前后交換,說明是倒序排列。
當后一個對象比當前對象小,返回結果值為1時,前后交換,說明是升序排列。