簡體   English   中英

如何在其中一個字段上對類對象列表進行排序?

[英]How to sort a list of class objects on one of its fields?

我有一個DataPoint對象列表。 類定義是:

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

         public String text; 

               ...
          }

“list”是DataPoint對象的ArrayList。 如何僅對X值排序列表? 會在這里使用Collections.sort(列表,比較器)嗎?

是的,您應該為每個字段創建特定的比較器。 例:

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

你有兩個選擇:

如果您想對對象進行自然排序(這將是最常用的對象),則第一個解決方案是有意義的。 通常它是您在需要額外訂購時使用比較器時首先使用的那個。

它們的行為方式相同,但Comparable<T>固有地附加到對象,因為它是默認的比較算法。 每當涉及排序時,將使用默認排序,除非您指定另一個排序。

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

請注意,當您需要比較對象時,您通常還需要對它們進行其他操作,因此請注意重寫hashCode()equals(Object o) 后者用於排序作為文檔狀態:

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

這意味着如果您只是比較X變量,則相對於compareTo具有相同X兩個不同DataPoint對象將被視為相等。 這可能會導致奇怪的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM