2012-12-30 35 views
2

我有一個DataPoint對象的列表。該類的定義是:如何對其某個字段上的類對象列表進行排序?

public static class DataPoint 
    { 
     public Comparable X; 
     public Comparable Y; 
     public Comparable Z; 

     public String text; 

       ... 
      } 

「list」是DataPoint對象的ArrayList。我如何對X值進行排序? Collections.sort(列表,比較器)會在這裏使用嗎?

回答

3

你有兩個選擇:

第一種方法是有意義的如果你想給你的對象(這將是最常用的)的自然排序。通常,這是您在需要額外排序時使用比較器時首先使用的那個。

它們的行爲方式都是一樣的,但Comparable<T>固有地附着在對象上,因爲它是它的默認比較算法。每當涉及到排序時,除非您指定另一個,否則將使用默認排序。

class DataPoint implements Comparable<DataPoint> { 
    @Override 
    public int compareTo(DataPoint o) { 
    return X.compareTo(o.X); 
    } 
} 

記住,當你需要比較的對象通常需要還包括其他業務上他們,所以採取覆蓋hashCode()equals(Object o)的照顧。後者用於按文檔狀態排序:

對於C類的自然排序被認爲與equals相等當且僅當e1.compareTo(e2)== 0具有與e1相同的布爾值.equals(e2)對於C類的每個e1和e2。... 強烈建議(儘管不要求)自然排序與等號一致。

這意味着,如果你只是比X變量,然後用相同X兩個不同DataPoint對象將被視爲相對於compareTo相等。這可能會導致奇怪的情況。

+0

是的我想對物體使用自然排序。你能告訴我語法嗎? –

5

是的,你應該爲每個字段創建特定的比較器。例如:

Comparator<DataPoint> compByX = new Comparator<DataPoint>() { 
    @Override 
    public int compare(DataPoint left, DataPoint right) { 
     return left.X.compareTo(right.X); 
    } 
}; 
Collections.sort(list, compByX); 
+0

你的意思是'left.X.compareTo(right.X);'或'left.Y.compareTo(right.Y);'? –

+0

@PeterLawrey哎呀,謝謝。 –

相關問題