我有以下代码对列表进行排序,但我需要将其降序排序,
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());
}
答案 0 :(得分: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);
}
}
将它与我们的示例一起使用:
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));
答案 1 :(得分: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);
或者,一个特定的解决方案是翻转比较方法中的参数:
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_VALUE
是不正确的解决方案。 Integer.MIN_VALUE * -1
是...... Integer.MIN_VALUE
答案 2 :(得分: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。然后你应该返回1如果x&lt; 0,
如果x&gt;返回-1如果x == 0,则返回0,就在compare()
方法内。
所以你的方法看起来像这样:
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;
}