【问题标题】:Iterating through HashMap by values按值遍历 HashMap
【发布时间】:2011-01-22 10:11:31
【问题描述】:

我需要遍历一个 HashMap,但要重视值的顺序。 例如,考虑以下<String, Integer> 的哈希映射:

{"dog" : 2, "bird": 3, "cat" : 1}

现在,我需要按值升序循环遍历搭扣图,以便

for () {
 System.out.println( currentKey );
}

总是会输出

“猫”、“狗”、“鸟”

【问题讨论】:

  • 在您的问题中,您的键和值都以相同的方式排序,因此很容易误解您的问题。如果地图是{"r" : 2, "q": 3, "z" : 1},您想要z r q(根据值1、2、3 的顺序)还是q r z?你已经说过“值的顺序”,所以我假设你想要z r q(根据值 1、2、3 的顺序),但是......另外,是否有重复的值?例如,{"r" : 2, "q": 3, "z" : 1, "w": 1}(有两个条目的值为 1)。如果是这样,您希望它们按什么顺序排列?用钥匙?不确定?
  • 您修复了第一部分,而不是第二部分:“另外,是否存在重复值?例如,{"r" : 2, "q": 3, "z" : 1, "w": 1}(有两个条目的值为 1)。如果是这样,您希望它们按什么顺序排列?按键?不确定?”

标签: java collections hashmap


【解决方案1】:

也许这会有所帮助:

Sort a Map<Key, Value> by values (Java)

【讨论】:

    【解决方案2】:

    好吧,您可能有兴趣改用 TreeMap,它会按键对您的条目进行排序。

    否则,您可能有兴趣查看Map.keySet()、Map.entrySet(), 或Map.values()。

    如果您仍想将 Map 保留为 HashMap,您可以使用 Collections' 众多函数中的一个来获取排序集合(例如,您可以获得地图的排序版本、排序列表等)。


    由于我看到您特别想按值排序,我认为Michał Minicki 的答案应该是您想要的。

    【讨论】:

      【解决方案3】:

      如果您希望在插入条目时让地图按值自行排序,那么最简单的方法可能是使用 Google 集合库中的 TreeMultimap 之类的东西。

      如果您仍想使用 hashmap 但在从集合中检索值时对它们进行排序,那么您可以采用两种方法 - 或者您可以使用 values() 方法获取值,然后运行 ​​Collections.sort( ) 在返回的列表中,或者您可以再次使用 TreeMultimap 之类的类,添加当前哈希图中的所有条目,然后枚举它们。

      【讨论】:

        【解决方案4】:

        另一个使用Guava的例子:

        优点:

        • 返回条目(不仅仅是键)
        • 不要求密钥为Comparable

        static <K, V>Set<Map.Entry<V, K>>
        entriesByValue(Map<K, V> source, Comparator<V> cmp) {
            SortedMap<V, Collection<K>> inverseMap = Maps.newTreeMap(cmp);
            Supplier<Set<K>> setFactory = new Supplier<Set<K>>() {
                public Set<K> get() {
                    return Sets.newHashSet();
                }
            };
            SetMultimap<V, K> inverseMM =
                Multimaps.newSetMultimap(inverseMap, setFactory);
            Multimaps.invertFrom(Multimaps.forMap(source), inverseMM);
            return Collections.unmodifiableSet(inverseMM.entries());
        }
        

        【讨论】:

          猜你喜欢
          • 2011-10-23
          • 1970-01-01
          • 2020-03-21
          • 2010-11-07
          • 1970-01-01
          • 2014-05-18
          • 2022-01-16
          • 2015-02-13
          • 2015-10-26
          相关资源
          最近更新 更多