我知道这个问题已经被问过好几次了,但请帮助我理解一些事情。
您有一张需要按值(value)排序的 map
Map<String, Integer> m = new HashMap<String, Integer>();
m.put("a", 1);
m.put("b", 13);
m.put("c", 22);
m.put("d", 2);
你调用一个方法来实现它
public static List<String> sortByValue(final Map<String, Integer> unsortedMap) {
List<String> sortedKeys = new ArrayList<String>();
sortedKeys.addAll(unsortedMap.keySet());
Collections.sort(sortedKeys, new MapComparator(unsortedMap));
return sortedKeys;
}
您有一个比较器类
public MapComparator(Map<String, Integer> m) {
this.m = m;
}
@Override
public int compare(String a, String b) {
int x = m.get(a);
int y = m.get(b);
if (x > y)
return x;
if (y > x)
return y;
return 0;
}
这段代码显然是有缺陷的。请帮我理解为什么?
最佳答案
if (x > y)
return x;
if (y > x)
return y;
return 0;
您应该返回1
如果x > y
和-1
如果y > x
。 Comparator
契约(Contract)规定,如果第一个值小于第二个值,则返回负数;如果第一个值大于第二个值,则返回正数;如果相等,则返回零。
(请注意,就目前情况而言,如果您碰巧使用原始映射中没有的值,此 Comparator
实现将以非常困惑的方式中断。)
更好的是,只需返回 Integer.compare(x, y)
,这一切都会为您完成。 (不过,仅在 Java 7 中。)
关于java - 按值对 map 进行排序,需要澄清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9170533/