28

compareTo値を比較して返すことを知っていintます。

例えば:

Returns
0 if a equal b
-1 if a < b
+1 if a > b

sortcompareToメソッドは、またはメソッドのいずれかを呼び出しcompare()ます。しかし、メソッドは値を比較または返すときにどのようにsort配置しますか。orがソートのために int 値を返した後に実行されるバックグラウンド シナリオは何ですか?メソッドは、 およびから返されたint 値 (またはlistcompareTointcomparecompareTosort-101comparecompareTo

4

4 に答える 4

27

比較される 2 つの要素 (a,b) が既に正しい順序になっていて、compare(a, b)両方a.compareTo(b)とも の値を返す場合、<= 0何も起こらないはずです。

順序が正しくない場合、戻り値は> 0になり、交換する必要があることを示します。

于 2012-09-13T04:26:24.200 に答える
4

一般的なケースの並べ替えアルゴリズムは、比較に基づいています。aと-を比較すると、b正確に 3 つの可能性があります: a == ba > ba < b

compare()orcompareTo()メソッドはまさにこの情報を提供します。

現在、この情報を使用するために、単純なバブル ソートから始めて、多数のソート アルゴリズムを設計してきましたが、クイック ソートなどのより高度なものもあります。それぞれがソートの問題に対して少し異なるアプローチを提供します。

Java は、ソートの実装にTimSortアルゴリズムを選択しました。

演習として、独自の1ソート アルゴリズムを設計できます。メソッドを使用して配列の最大要素を見つけることができますcompare()か? いつどこにあるはずですか?次に何をすべきですか?


(1) まあ、自分で考えてみてください。しかし、実際には既に存在します :)

于 2012-09-12T10:31:00.820 に答える
2

このドキュメントを読んでください:

  • a.compareTo(b):
    同等のインターフェース。値を比較し、値がより小さいか、等しいか、より大きいかを示す int を返します。クラス オブジェクトに自然な順序がある場合は、Comparable インターフェイスを実装し、このメソッドを定義します。自然順序付けを持つすべての Java クラスは、これを実装します (String、Double、BigInteger など)。

  • compare(a, b):
    コンパレータ インターフェイス。2 つのオブジェクトの値を比較します。これは Comparator インターフェースの一部として実装され、典型的な用途は、これを実装する 1 つ以上の小さなユーティリティ クラスを定義して、sort() などのメソッドに渡したり、TreeMap や TreeSet などのデータ構造を並べ替えて使用したりすることです。次の Comparator オブジェクトを作成することができます。

    • 複数の比較。何かをソートするためのいくつかの異なる方法を提供すること。たとえば、Person クラスを名前、ID、年齢、身長などで並べ替えたい場合があります。これらのそれぞれに対して Comparator を定義し、sort() メソッドに渡します。
    • システム クラス ユーザーが制御できないクラスの比較メソッドを提供します。たとえば、文字列を長さで比較する Comparator を定義できます。
    • ストラテジー パターン ストラテジー パターンを実装するには、パラメーターとして渡すことができるオブジェクトとしてアルゴリズムを表現したり、データ構造に保存したりしたい状況です。
于 2012-09-12T10:27:39.117 に答える