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

sort a TreeSet with HashMap<string,integer> as its type

例如,

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

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

如所写 ("sort this treeset based on the Integer value from HashMap"),此要求要么没有意义,要么指的是 complicated/confusing 设计。

您真的要根据值集来订购一组地图吗?或者您实际上只是使用 Map 作为 Tuple2 等的替代品?

如果您的意图是前者,那么当然,您可以创建一个客户比较器;但是该 Comparator 的语义对大多数人来说并不明显,您最终可能会得到一个在 insertions/deletions.

上表现出 O(n^2)-ish 行为的实现

如果是后者,那么您的系统将再次令人困惑,但其不变量的建模会更加糟糕。也就是说,您 假设 每个 Map 只包含一个键值绑定,虽然您当然可以通过运行时检查强制执行此约束,将其记录在 javadoc 等中,但这是违反直觉的Map类型的使用。在这种情况下,正如 JB Nizet 提到的那样,只创建一个带有 String 和 Integer 字段的容器 class 会好得多,您可以使用 Comparator 轻松地对这个 class 的集合进行排序,或者通过使 class 实现 Comparable。

您需要设计一个自定义比较器并将其作为构造函数提供给您的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)