1. 程式人生 > >Comparable介面 排序

Comparable介面 排序

compareTo返回值為-1 、 1 、 0 的排序問題

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時,前後交換,說明是升序排列。