我需要遍历HashMap,但要重视值的顺序。
例如,请考虑以下<String, Integer>
的哈希映射:
{"dog" : 2, "bird": 3, "cat" : 1}
现在,我需要按照递增值的顺序遍历hasp映射,以便
for () {
System.out.println( currentKey );
}
将始终输出
“猫”,“狗”,“鸟”
答案 0 :(得分:4)
好吧,您可能感兴趣的是使用TreeMap,它会按键对您的条目进行排序。
否则,您可能会对Map.keySet(),Map.entrySet(),或Map.values()感兴趣。
如果你仍然想让你的Map成为HashMap,你可以使用Collections'众多函数之一来获取已排序的集合(例如,你可以得到你的地图的排序版本,排序列表等)。
由于我看到你特意想按值排序,我认为Michał Minicki的回答应该是你想要的。
答案 1 :(得分:4)
也许这会有所帮助:
答案 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());
}