web-dev-qa-db-ja.com

JavaのCollections.sort(list、コンパレータ)のソート順は何ですか?小から大、大から小?

どうやら、それは文書化されていないか、見逃していました。

ここ はドキュメントへのリンクで、下は画像としてのテキストです:

[〜#〜] edit [〜#〜](17/5):あまりにも多くの人がこの質問を比較質問として混乱させていると思います。そうではない。コンパレータは2つの要素を比較します。その比較に従って、リストがソートされました。 どのように?昇順または降順?

質問をさらに洗練/簡素化します:コンパレータが要素Aが要素Bよりも小さいと判断した場合、ソートされたリストで、要素A要素Bよりも低いインデックスに配置されていますか?

enter image description here

37

ソート順は常にascendingです。Comparatorはどのアイテムが他のアイテムよりも大きいかを定義します。

Collections.sort(List <T> list、Comparator <?super T> c) のドキュメントから:

指定されたコンパレータによって誘導された順序に従って、指定されたリストをソートします。

Comparator.compare(T、T) のドキュメントから:

2つの引数の順序を比較します。最初の引数が2番目の引数より小さい、等しい、または大きいため、負の整数、ゼロ、または正の整数を返します。

32
Andy Thomas

あなた(またはむしろ、あなたのコンパレータ)が決定します。

  • _o1_が_o2_より小さいときにComparatorcompare(T o1, T o2)が負を返す場合、昇順( ideone on ideone )になります。
  • _o1_が_o2_より大きいときにComparatorcompare(T o1, T o2)が負を返す場合、降順( ideone on ideone )になります。

同じことを別の言い方をすると、sortは、コンパレーターが渡された2つの項目を小さい(_o1_)から大きい(_o2_)に順序付け、昇順を生成すると想定することです。その順序と一致する並べ替え。

20
dasblinkenlight

Comparator.compareTo(o1, o2)メソッドのドキュメントには、

2つの引数の順序を比較します。最初の引数が2番目の引数より小さい、等しい、または大きいため、負の整数、ゼロ、または正の整数を返します。

したがって、自然な順序(小さいから大きい)でソートする場合は、ドキュメントで定義されている実装を作成する必要があります

public int compareTo(Integer o1, Integer o2) {
     int v1 = (o1);
     int v2 = (o2);
     if(v1 == v2) {
        return 0;
     }
     if(v1 < v2) {
        return -1; //return negative integer if first argument is less than second
     }
     return 1;
}

並べ替えを逆順にしたい場合、それは大から小です

public int compareTo(Integer o1, Integer o2) {
     int v1 = (o1);
     int v2 = (o2);
     if(v1 == v2) {
        return 0;
     }
     if(v1 < v2) {
        return 1;  //do the other way
     }
     return -1;
}
3
sanbhat

ドキュメントによると https://docs.Oracle.com/javase/7/docs/api/Java/util/Collections.html#sort(Java.util.List、%20Java.util.Comparator =、Collections.sort(list、コンパレータ)のソート実装はmergeSortです。

MergeSortによって生成された結果が昇順( https://en.wikipedia.org/wiki/Merge_sort )の場合、Collections.sort(list、コンパレータ)のソート順は昇順です。

つまり、コンパレーターがエレメントAがエレメントBよりも小さいと判断した場合です。ソート済みリストでは、エレメントAはエレメントBよりも小さいインデックスに配置されます。

0
Ethan