1

リストを並べ替える次のコードがありますが、降順で並べ替える必要があります。

List list = new LinkedList(thismap.entrySet());
Collections.sort(list, new Comparator() {
    public int compare(Object o1, Object o2) {
        return ((Comparable) ((Map.Entry) (o2)).getValue())
                .compareTo(((Map.Entry) (o1)).getValue());
    }
});

Map output = new LinkedHashMap();
for (Iterator it = list.iterator(); it.hasNext();) {
    Map.Entry entry = (Map.Entry) it.next();
    output.put(entry.getKey(), entry.getValue());
}
4

3 に答える 3

8

一般的な一般的な手法は、単純に引数を交換することで Comparator を逆の Comparator にラップすることです。

class ReverseComparator<T> implements Comparator<T> {

    private final Comparator target;

    public ReverseComparator(Comparator<T> target) {
        super();
        this.target = target;
    }

    public int compare(T first, T second) {
        return target.compare(second, first);
    } 
}

私たちの例でそれを使用するには:

Comparator original = new Comparator() {
    public int compare(Object o1, Object o2) {
        return ((Comparable) ((Map.Entry) (o2)).getValue())
            .compareTo(((Map.Entry) (o1)).getValue());
    }
};

Collections.sort(list, new ReverseComparator(original));
于 2012-10-06T00:57:26.837 に答える
6

簡単な一般的な答えは、 を使用することjava.util.Collections.reverseOrder(Comparator)です。

Comparator myComparator = new Comparator() {
    public int compare(Object o1, Object o2) {
    return ((Comparable) ((Map.Entry) (o2)).getValue())
        .compareTo(((Map.Entry) (o1)).getValue());
    }
}
// ... or whatever.

Comparator myReverseComparator = Collections.reverseOrder(myComparator);

または、特定の解決策は、compare メソッドでパラメーターを反転することです。

Comparator myReverseComparator = new Comparator() {
    public int compare(Object o2, Object o1) {  // <== NOTE - params reversed!!
    return ((Comparable) ((Map.Entry) (o2)).getValue())
        .compareTo(((Map.Entry) (o1)).getValue());
    }
}

特殊なケース であるため、乗算-1正しくないことに注意してください。は ...Integer.MIN_VALUEInteger.MIN_VALUE * -1Integer.MIN_VALUE

于 2012-10-06T02:19:30.910 に答える
1

以下のメソッドの内容を変更するだけです。

public int compare(Object o1, Object o2) 
{
    return ((Comparable) ((Map.Entry) (o2)).getValue())
           .compareTo(((Map.Entry) (o1)).getValue());
}

以下のステートメントの値とは異なる結果を返します。

((Comparable)((Map.Entry)(o2)).getValue()).compareTo(((Map.Entry)(o1)).getValue());

上記のステートメントが x に割り当てられているとしましょう。compare()次に、メソッドのすぐ内側で、x < 0 の場合は 1 を返し、x > 0 の場合は -1 を返し、x == 0 の場合は 0 を返す必要があります。

したがって、メソッドは次のようになります。

public int compare(Object o1, Object o2) 
{
   int x = ((Comparable)((Map.Entry)(o2)).getValue())
             .compareTo(((Map.Entry)(o1)).getValue());
   if(x > 0)
     return -1;
   else if (x < 0)
     return 1;

   return 0;
}
于 2012-10-06T00:53:03.053 に答える