43

どうやら、それは文書化されていないか、私が見逃したようです。

ドキュメントへのリンクは次のとおりです。以下は画像としてのテキストです。

編集(17/5):この質問を比較質問と混同している人が多すぎると思います。そうではない。コンパレータは 2 つの要素を比較します。その比較に従って、リストがソートされました。どのように?昇順か降順か?

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

ここに画像の説明を入力

4

4 に答える 4

38

並べ替え順序は常に昇順で、Comparator はどの項目が他の項目よりも大きいかを定義します。

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

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

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

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

于 2013-07-14T17:51:36.747 に答える
22

あなた(というか、比較者)が決定します。

  • が より小さいときに が負を返す場合、昇順になります ( ideone のデモComparator) 。compare(T o1, T o2)o1o2
  • が より大きいときに が負を返す場合、降順になります ( ideone のデモComparator) 。compare(T o1, T o2)o1o2

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

于 2013-07-14T17:44:36.580 に答える
5

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;
}
于 2013-07-14T17:47:51.707 に答える