通过值迭代HashMap

时间:2011-01-22 10:11:32

标签: java collections hashmap

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

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

现在,我需要按照递增值的顺序遍历hasp映射,以便

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

将始终输出

  “猫”,“狗”,“鸟”

4 个答案:

答案 0 :(得分:4)

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

否则,您可能会对Map.keySet()Map.entrySet(),Map.values()感兴趣。

如果你仍然想让你的Map成为HashMap,你可以使用Collections'众多函数之一来获取已排序的集合(例如,你可以得到你的地图的排序版本,排序列表等)。


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

答案 1 :(得分:4)

也许这会有所帮助:

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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