【问题标题】:sort a TreeSet with HashMap<string,integer> as its type以 HashMap<string,integer> 作为其类型对 TreeSet 进行排序
【发布时间】:2015-02-03 20:41:55
【问题描述】:

例如,

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

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

【问题讨论】:

  • TreeSet的构造函数上提供一个自定义的Comparator&lt;HashMap&lt;String, Integer&gt;&gt;。不过,这似乎是一个奇怪的设计。
  • 整数值?为什么使用 Map 存储一个键和一个值?您应该创建一个包含 String 字段和 Integer 字段的类。

标签: java sorting dictionary tree


【解决方案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)

【讨论】:

    【解决方案2】:

    正如所写(“根据来自 HashMap 的整数值对树集进行排序”),此要求要么没有意义,要么涉及复杂/令人困惑的设计。

    您真的想根据其值集订购一组地图吗?还是您实际上只是使用 Map 作为 Tuple2 的替代品?

    如果您的意图是前者,那么当然,您可以创建一个客户比较器;但是该 Comparator 的语义对于大多数人来说并不明显,并且您最终可能会得到一个在插入/删除时表现出 O(n^2)-ish 行为的实现。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多