当我需要按值对HashMap进行排序时,建议是创建HashMap,然后将数据放入按值排序的TreeMap中。
例如:Sort a Map<Key, Value> by values (Java) 我的问题是:为什么需要这样做?为什么不创建一个按键排序的TreeMap,然后就地按值排序呢?
例如:Sort a Map<Key, Value> by values (Java) 我的问题是:为什么需要这样做?为什么不创建一个按键排序的TreeMap,然后就地按值排序呢?
HashMap
一样创建HashBiMap
,然后从其反转创建一个新的TreeMap
。new TreeMap<>(biMap.inverse());
Multimaps.invertFrom(Multimaps.forMap(myMap), new TreeMultimap<V, K>());
提供了Multimap文档链接。
TreeMap
的条目。 TreeMap 条目始终按键排序。map.containsKey(keyNotInOriginalMap)
时容易出现奇怪的错误,突然间你会收到非常令人困惑的异常,并且不知道为什么会出现这种情况。 - Louis WassermanList<V> theValues = new ArrayList<V>(map.values()); Collections.sort(theValues);
- Louis Wasserman我使用Java 8 Stream API编写了以下一行代码,可以按值对任何给定的映射进行排序:
List<Map.Entry<String, String>> sortedEntries = map.entrySet().stream()
.sorted((o1, o2) -> o1.getValue().compareTo(o2.getValue())).collect(Collectors.toList());
public class SortMapByValues {
public static void main(String[] args) {
Map<Integer, String> myMap = new LinkedHashMap<Integer, String>();
myMap.put(100, "hundread");
myMap.put(500, "fivehundread");
myMap.put(250, "twofifty");
myMap.put(300, "threehundread");
myMap.put(350, "threefifty");
myMap.put(400, "fourhundread");
myMap = sortMapByValues(myMap);
for (Map.Entry<Integer, String> entry : myMap.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
}
public static Map<Integer, String> sortMapByValues(
Map<Integer, String> firstMap) {
Map<String, Integer> SecondyMap = new TreeMap<String, Integer>();
for (Map.Entry<Integer, String> entry : firstMap.entrySet()) {
SecondyMap.put(entry.getValue(), entry.getKey());
}
firstMap.clear();
for (Map.Entry<String, Integer> entry : SecondyMap.entrySet()) {
firstMap.put(entry.getValue(), entry.getKey());
}
return firstMap;
}
}
输出:
500 fivehundread
400 fourhundread
100 hundread
350 threefifty
300 threehundread
250 twofifty