繁体   English   中英

按值遍历HashMap

[英]Iterating through HashMap by values

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

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

现在,我需要按升序循环遍历hasp映射,以便

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

将始终输出

“猫”,“狗”,“鸟”

好吧,您可能对使用TreeMap感兴趣,它使用键对您的条目进行排序。

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

如果仍然想让地图保持为HashMap,则可以使用Collections的众多功能之一来获取排序的集合(例如,可以获取地图的排序版本,对列表进行排序等)。


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

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

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

使用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());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM