5

ソートしたい要素のリストがある場合、Javaはこれを行うための2つの方法を提供します。

たとえば、Movieオブジェクトのリストがあり、それらをタイトルで並べ替えたいとします。

これを行う1つの方法は、ムービーリストを単一の引数として静的java.util.Collections.sort()メソッドの1つの引数バージョンを呼び出すことです。したがって、Collections.sort(myMovieList)を呼び出します。これを機能させるには、java.lang.Comparableインターフェイスを実装するようにMovieクラスを宣言する必要があり、必要なメソッドcompareTo()をこのクラス内に実装する必要があります。

ソートする別の方法は、静的java.util.Collections.sort()メソッドの2つの引数バージョンを、ムービーリストとjava.util.Comparatorオブジェクトを引数として呼び出すことです。私はCollections.sort(myMovieList、titleComparator)を呼び出します。この場合、MovieクラスはComparableインターフェイスを実装しません。代わりに、ムービーリスト自体を構築および維持するメインクラス内に、java.util.Comparatorインターフェイスを実装する内部クラスを作成し、必要な1つのメソッドcompare()を実装します。次に、このクラスのインスタンスを作成し、2引数バージョンのsort()を呼び出します。この2番目のメソッドの利点は、これらの内部クラスのコンパレータを無制限に作成できるため、オブジェクトのリストをさまざまな方法で並べ替えることができることです。上記の例では、

私の質問は、2引数バージョンのCollections.sort()が最初の1引数バージョンが行うすべてのことを実行するのに、なぜJavaで両方のソート方法を学ぶ必要があるのか​​ということですが、リストの要素をソートできるという追加の利点がありますいくつかの異なる基準に基づいていますか?コーディング中に覚えておかなければならないことが1つ少なくなります。知っておくべきJavaでリストをソートする基本的なメカニズムが1つあります。

4

3 に答える 3

14

1つは、一般的なケースを簡潔にするためです(Effective Java 2nd Edition、Item 12:実装を検討してくださいComparable)。もう1つは、ご指摘のとおり、柔軟性と汎用性のためです。

関連する質問

于 2010-05-23T18:46:46.883 に答える
6

誰が順序を制御するかによって異なります。オブジェクトの順序がオブジェクトの実装の詳細である場合は、Comparableがより適切です。オブジェクトの順序が呼び出し元によって制御されている場合Comparatorは、より適切です。

于 2010-05-23T18:47:12.343 に答える
3

そんなに奇妙だと思うかどうかはわかりません。数字のような自然な順序で並べ替えるリストがあります。数値を比較する方法をAPIに指示する必要があると本当に期待していますか?直感的に、2引数のメソッドを探すことはしません。したがって、Comparableが存在します。

しかしもちろん、別の順序、つまり他の方法を定義することはできますし、できるはずです。たとえば、数値には自然な順序がありますが、別の順序が必要な場合があります。たとえば、値の降順などです。したがって、コンパレータが存在します。

そしてもちろん、フルーツのように自然な順序がないものもありますが、それでもそれらのリストを注文したい場合があります。したがって、再びコンパレータ。

于 2010-05-23T18:47:40.057 に答える