如何使用基于 "external" 值的比较器创建 TreeMap
How to create a TreeMap with a comparator based on "external" values
我有一个 Map<String, Integer> otherMap
将字符串的属性映射到一些关联的整数值。
现在我想要一个 TreeMap<String, String>
,它根据 otherMap
中的相关整数对键进行排序。
我应该如何解决这个问题,需要牢记什么?
(这是 的后续)
编写比较器时,重要的是要确保结果一致(即随着时间的推移相同)并且它实现了 total order.
在TreeMap
中使用比较器时还要求与equals一致,即c.compare(e1, e2)
return 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);
我有一个 Map<String, Integer> otherMap
将字符串的属性映射到一些关联的整数值。
现在我想要一个 TreeMap<String, String>
,它根据 otherMap
中的相关整数对键进行排序。
我应该如何解决这个问题,需要牢记什么?
(这是
编写比较器时,重要的是要确保结果一致(即随着时间的推移相同)并且它实现了 total order.
在TreeMap
中使用比较器时还要求与equals一致,即c.compare(e1, e2)
return 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);