[英]Java 8 HashMap<Integer, ArrayList<Integer>>
我是新的Java 8,想要基於Key對Map進行排序,然后對值中的每個列表進行排序。
我試圖尋找一種Java 8方式來對Keys進行排序,也很有價值。 HashMap>地圖
map.entrySet().stream().sorted(Map.Entry.comparingByKey())
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue, (e1, e2) -> e2, LinkedHashMap::new));
我能夠對Map進行排序,我可以收集map中的每個值進行排序,但這是我們在java 8中可以做到的一種方式,並且可以將它們組合在一起。
要按鍵排序,可以使用TreeMap
。 要對值中的每個列表進行排序,可以使用Map.values().forEach()
方法迭代映射的值,然后使用List.sort
對每個列表進行List.sort
。 把它們放在一起:
Map<Integer, List<Integer>> sortedByKey = new TreeMap<>(yourMap);
sortedByKey.values().forEach(list -> list.sort(null)); // null: natural order
這會對每個列表進行就地排序,這意味着原始列表會發生變異。
相反,如果您不僅要創建新地圖,還要為每個值創建新列表,則可以按如下方式創建:
Map<Integer, List<Integer>> sortedByKey = new TreeMap<>(yourMap);
sortedByKey.replaceAll((k, originalList) -> {
List<Integer> newList = new ArrayList<>(originalList);
newList.sort(null); // null: natural order
return newList;
});
編輯:
正如評論中所建議的那樣,您可能想要更改:
sortedByKey.values().forEach(list -> list.sort(null));
通過:
sortedByKey.values().forEach(Collections::sort);
要么:
sortedByKey.values().forEach(list -> list.sort(Comparator.naturalOrder()));
上面兩個選項中的任何一個都更具表現力,並且比使用null
作為List.sort
方法的比較器參數更好地顯示開發人員的意圖。
同樣的考慮因素適用於未就地修改列表的方法。
你可以這樣做,
Map<Integer, List<Integer>> sortedMap = sourceMap.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey,
e -> e.getValue().stream().sorted().collect(Collectors.toList()),
(v1, v2) -> v1,
TreeMap::new));
注意TreeMap
的使用,它根據其鍵的自然順序排序。 然后在將現有值List
傳遞給Collector
之前對其進行排序。 另請注意,我忽略了mergeFunction
因為與同一個鍵關聯的值之間不會發生任何沖突。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.