如何使用基于" external"的比较器创建TreeMap。值

时间:2015-03-12 09:29:44

标签: java treemap

我有一个Map<String, Integer> otherMap,它将字符串的属性映射到一些相关的整数值。

现在我希望TreeMap<String, String>根据otherMap中的关联整数对键进行排序。

我应该如何解决这个问题,以及要记住哪些重要事项?

(这是对this question的跟进。)

1 个答案:

答案 0 :(得分:2)

在编写比较器时,重要的是确保结果一致(即随着时间的推移是相同的)并且它实现了total order

TreeMap中使用比较器时,还需要与等于一致,这意味着c.compare(e1, e2)返回0当且仅当e1.equals(e2)

考虑到这一点,可以按如下方式实施正确的比较器:

class MyComparator implements Comparator<String> {

    Map<String, Integer> otherMap;

    public MyComparator(Map<String, Integer> otherMap) {
        this.otherMap = otherMap;
    }

    @Override
    public int compare(String o1, String o2) {
        int primary = otherMap.get(o1).compareTo(otherMap.get(o2));
        if (primary != 0)
            return primary;
        // Fall back on comparing the string keys to ensure consistent results
        return o1.compareTo(o2);
    }
}

(应该注意的是,otherMap在传递给MyComparator后永远不会发生变化也很重要。)


在Java 8中,惯用解决方案看起来像

Comparator.comparing(k -> otherMap.get(k))
          .thenComparing(k -> k);