将升序排序更改为降序

Eme*_*ana 1 java sorting

我有以下代码来排序列表,但我需要使它降序排序,

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());
}
Run Code Online (Sandbox Code Playgroud)

Bre*_*den 8

一种常见的通用技术是通过简单地交换参数将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);
    } 
}
Run Code Online (Sandbox Code Playgroud)

要将它与我们的示例一起使用:

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));
Run Code Online (Sandbox Code Playgroud)

  • 为什么不使用`java.util.Collections.reverseOrder(Comparator)`而不是滚动你自己的`ReverseComparator`类? (7认同)

Ste*_*n C 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);
Run Code Online (Sandbox Code Playgroud)

或者,一个特定的解决方案是翻转比较方法中的参数:

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,由于边缘情况,乘以-1是一个不正确的解决方案Integer.MIN_VALUE. Integer.MIN_VALUE * -1是......Integer.MIN_VALUE