2

DataPoint オブジェクトのリストがあります。クラス定義は次のとおりです。

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

         public String text; 

               ...
          }

「list」は、DataPoint オブジェクトの ArrayList です。X 値だけでリストを並べ替えるにはどうすればよいですか? Collections.sort(list, comparison) はここで使用されますか?

4

2 に答える 2

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);
于 2012-12-30T19:32:17.683 に答える
3

次の 2 つの選択肢があります。

最初の解決策は、オブジェクトに自然な順序を付けたい場合に意味があります (最も使用されるものになります)。通常、追加の順序付けが必要なときにコンパレータを使用するときに最初に使用するものです。

どちらも同じように動作しComparable<T>ますが、デフォルトの比較アルゴリズムであるため、本質的にオブジェクトに関連付けられています。別のソートを指定しない限り、ソートが含まれる場合は常にデフォルトのソートが使用されます。

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

オブジェクトを比較する必要がある場合は、通常、オブジェクトに対する他の操作も必要になるため、オーバーライドhashCode()equals(Object o). ドキュメントに記載されているように、後者はソートに使用されます。

クラス C の自然順序付けは、e1.compareTo(e2) == 0 がクラス C のすべての e1 および e2 について e1.equals(e2) と同じブール値を持つ場合にのみ、equals と一致すると言われます。.. .自然な順序付けが equals と一致することを強くお勧めします (必須ではありません)。

これは、X 変数を比較するだけDataPointで、同じ値を持つ 2 つの異なるオブジェクトXが に関して等しいと見なされることを意味しcompareToます。これにより、奇妙な状況が発生する可能性があります。

于 2012-12-30T19:33:44.173 に答える