9

メソッドの実装と Collections.sort メソッドのロジックが理解できません。これが私が見つけたメソッドの実装です。

public static <T extends Comparable<? super T>> void sort(List<T> list) {
    Object[] a = list.toArray();
    Arrays.sort(a);
    ListIterator<T> i = list.listIterator();
    for (int j=0; j<a.length; j++) {
        i.next();
        i.set((T)a[j]);
    }
    }

まず、このメソッドの戻り値の型は void です。<T extends Comparable<? super T>>メソッド署名には何がありますか?

ここで Array.sort を使用する目的は何ですか?

また、comparable または comparison を実装したら、考慮に入れるために記述した compare または compareTo メソッドのロジックはどこにあるのでしょうか?

4

5 に答える 5

18

ジェネリック型が表示される場所に注意してください。

public static <T extends Comparable<? super T>> void sort(List<T> list)

基本的にジェネリック型の宣言と制限を行いTます。この特定のケースでは、次のことをT意味Comparable<F>FますT。これは、次のクラスがある場合を意味します。

class Animal {}

class Dog extends Animal implements Comparable<Animal> {
    //...
}

に渡すこともできますList<Dog>(通常とは異なり、が実装されCollections.sort()ていることに注意してください)。DogComparable<Animal>Comparable<Dog>


Arrays.sort()これは、ソートアルゴリズムが実装されている場所であるため使用されます。コレクションから配列への防御的なコピーは、コントラクトに従い、コレクションがランダム アクセスでない場合に最適ではないランタイムを回避するために必要です。

一部のリストでは、LinkedListランダム アクセス (インデックスによる) パフォーマンスが低く、ほとんどの並べ替えアルゴリズムが非常に遅くなります (範囲内O(n^2))。コレクション全体を防御的にコピーし、配列でソートを実行することO(n + nlogn + n)O(nlogn)お勧めします-大きなO表記を取得した場合)。

于 2013-01-14T16:40:08.813 に答える
8

仕組みCollections.sortとしては、コレクションの基になる配列を実際に取得し、そのsort メソッドを呼び出して実際の要素を並べ替えます。Java で使用されるそのソート アルゴリズムは、非常に高速な Timsortです。

コレクションを in-placevoidでソートするため、このメソッドは戻ります。つまり、要素を並べ替えることによって、パラメーターとして指定したコレクションを変更します。ソートされたコピーを返すことは、リソースの浪費になります。

于 2013-01-14T16:39:46.537 に答える
2

まず第一に、このメソッドの戻り型はvoidです

インプレース実装だからです。メソッドに渡されたリストはソートされます

<T extends Comparable<? super T>>メソッドシグネチャには何が含まれていますか?

タイプとその子のComparableインターフェイスを拡張する結果を比較します。T

Object [] a = list.toArray();

リストをプレーン配列に変換します。

ここでArray.sortを使用する目的は何ですか?

配列のソート。

i.set((T)a [j]);

配列からソートされた順序でリスト要素に割り当てます

于 2013-01-14T16:42:08.063 に答える
1
 What is <T extends Comparable<? super T>>

Tこれはinの Type を指定するためのものList<T>です。型推論に関するこのチュートリアルを読んでください。

于 2013-01-14T16:37:47.520 に答える
1

まず、このメソッドの戻り値の型は void です。> はメソッド シグネチャで何をしますか?

はメソッドで使用する一般的な Type であり、T は java.util.Comparable を実装するオブジェクトのみにすることができます。

たとえばList<String>、 sort メソッドに a を渡したい場合は、 java.lang.Stringimplementsとしてコンパイルされjava.lang.Comparableますが、渡すと、 implementsでList<Animal>ない限りコンパイラ エラーが発生します。Animaljava.lang.comparable

于 2013-01-14T16:38:43.333 に答える