java - 按值对 map 进行排序,需要澄清

标签 java comparator

我知道这个问题已经被问过好几次了,但请帮助我理解一些事情。

您有一张需要按值(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 > xComparator契约(Contract)规定,如果第一个值小于第二个值,则返回负数;如果第一个值大于第二个值,则返回正数;如果相等,则返回零。

(请注意,就目前情况而言,如果您碰巧使用原始映射中没有的值,此 Comparator 实现将以非常困惑的方式中断。)

更好的是,只需返回 Integer.compare(x, y) ,这一切都会为您完成。 (不过,仅在 Java 7 中。)

关于java - 按值对 map 进行排序,需要澄清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9170533/

相关文章:

java - 套接字多线程 - 读取输入流暂停线程

java - Struts 2与Atmosphere的整合(不触发Action)

java - Kotlin 使用 JDK 模块

java - 比较两个或多个 JTables 和 'Highlight' 差异

java - Hibernate、Log4j 和 SLF4j

java - FragmentTabHost - 没有已知标签为空的标签

java - 不能在 Comparator<String> 中使用静态 List<String>

java - 比较器返回类型与整数不兼容

c++ - 如何为 =0 创建 C++ 赋值运算符

java - 修复 Java 中的 "unchecked conversion found"警告?