簡體   English   中英

如何獲取列表,將其收集到 map,然后使用 Java Streams 進行排序?

[英]How do I take a list, collect it to a map, then sort using Java Streams?

我有以下代碼....

public Map<Object, Integer> getRankings(){
    Stream<String> stream = votes.stream();
    return stream
            .collect(Collectors.toMap(s -> s, s -> 1, Integer::sum));
}

這很好用,但現在我想根據計數對 map 進行排序。 我在收集后嘗試了排序,但該方法不可用,因為 stream 現在是 map。 在返回之前我將如何對其進行排序? 我可以使用 Stream 還是必須排序為 map?

地圖基本上是未排序的。 因此,您不能暗示訂單。

然而,map 的一些特定子類確實包含了排序的定義。 重點是, java.util.Map本身沒有,所以我們必須深入研究子類; 例如,不能訂購new java.util.HashMap ,期間。

LinkedHashMap 按“插入順序”排序,因此,您可以為其強制執行順序。

SortedMap 類(例如 TreeMap)是按key排序的,帶有一個比較器,因此也不可能按 value 對它們進行排序。

一般的答案是你遇到了一些問題 X 並想:我知道。 我將通過按值排序的 map 來解決這個未知問題 X,但這不太可能是解決 X 的好方法,不幸的是,你沒有說 X 是什么:你只是在問關於如何得到一個 map 按 java 中的值排序,因此我們現在卡住了。 Oooooof,這真的很難做到。

以防萬一你仍然認為你的這個“按值排序的地圖”的想法是如何解決 X:

沒有.toLinkedHashMap 有一個帶有第四個參數的Collectors.toMap變體,它是 lambda,它為您生成 map。 使用那個,傳入一個 lambda 來生成一個new LinkedHashMap 然后你需要強制 stream API 以正確的順序插入,這是不可能的。

所以,我們需要使這成為可能:首先收集到一個普通的簡 map。 然后通過詢問 map 的入口集並在其上流式傳輸,將其重新旋轉為 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ。 然后,將 stream 轉換為排序后的 stream,在entry.getValue()上排序。 然后使用允許您提供 mapSupplier 的 Collectors.toMap 方法之一,將生成的順序排序 stream 收集回 map。 您不需要在此處分組 toMap - 您的 stream 對象已准備好逐字插入。

這當然是低效的,並且有一個中間階段 map 然后立即被扔進垃圾箱。 但這是做到這一點的唯一方法,這可以追溯到:按值排序的地圖相當棘手。

該解決方案有效,但我會以更“流暢”的方式進行檢查。

public Map<Object, Integer> getRankings(){
    Stream<String> stream = votes.stream();
    Map<Object, Integer> map = stream
            .collect(Collectors.toMap(s -> s, s -> 1, Integer::sum));
    return Vote.sortByValues(map);
}

public static <K, V extends Comparable<V>> Map<K, V> sortByValues(final Map<K, V> map) {
    Comparator<K> valueComparator =  new Comparator<K>() {
        public int compare(K k1, K k2) {
            int compare = map.get(k2).compareTo(map.get(k1));
            if (compare == 0) return 1;
            else return compare;
        }
    };
    Map<K, V> sortedByValues = new TreeMap<K, V>(valueComparator);
    sortedByValues.putAll(map);
    return sortedByValues;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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