簡體   English   中英

Java 8 HashMap <Integer,ArrayList <Integer >>

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM