使用HashMap <string,integer>作为其类型</string,integer>对TreeSet进行排序

时间:2015-02-03 20:41:55

标签: java sorting dictionary tree

例如,

TreeSet<HashMap<String,Integer>> myTree = new  TreeSet<HashMap<String,Integer>>();

我想根据HashMap的Integer值对这个树集进行排序。我们有什么好方法可以做到吗?

2 个答案:

答案 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)