例如,
TreeSet<HashMap<String,Integer>> myTree = new TreeSet<HashMap<String,Integer>>();
我想根据HashMap的Integer值对这个树集进行排序。我们有什么好方法可以做到吗?
答案 0 :(得分:1)
正如所写(&#34;根据来自HashMap&#34的整数值对此树集进行排序),此要求要么没有意义,要么指的是复杂/混乱的设计。
您真的想根据价值集订购地图集吗?或者你实际上只是使用Map作为例如Tuple2的替身?
如果你的意图是前者,那么你可以创建一个客户比较器;但是对于大多数人来说,比较器的语义是不明显的,并且你可能最终会得到一个在插入/删除时表现出O(n ^ 2) - 行为的实现。
如果它是后者,那么你的系统将再一次令人困惑,但它的不变量将更加模糊。也就是说,你假设每个Map只包含一个键值绑定,虽然你可以通过运行时检查强制执行这个约束,在javadoc等中记录它,但这是违反直觉的用法。地图类型。在这种情况下,正如JB Nizet所提到的,只是创建一个带有String和Integer字段的容器类会更好,并且您可以通过使用Comparator或通过使类实现Comparable轻松地对此类的集合进行排序。
答案 1 :(得分:1)
您需要设计一个自定义比较器,并将其作为构造函数提供给TreeSet
,
public static Set<HashMap<String, Integer>> myTree = new TreeSet<>(
new Comparator<HashMap<String, Integer>>() {
@Override
public int compare(HashMap<String, Integer> o1,
HashMap<String, Integer> o2) {
return (o2.get(key)).compareTo(o1.get(key));
}
});
只需用整数键替换key
。
如果你想让它以相反的方式排序,
替换,
o2.get(key)).compareTo(o1.get(key)
用,
o1.get(key)).compareTo(o2.get(key)