次の 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
ます。これにより、奇妙な状況が発生する可能性があります。