簡體   English   中英

首先用值對 hashmap 進行排序,然后在 java 中排序

[英]Sorting a hashmap first with values then keys in java

Hello guys i have a hash map like a:1,c:2,d:3,b:2 and i want to sort it like d:3,b:2,c:2,a:1, descending in values and按鍵中的字母順序我該怎么做我將不勝感激任何幫助謝謝!

按值的降序排序以下內容,然后是鍵。 我修改了列表以使其更有趣。

Map<String, Integer> map = Map.of("a", 8, "b", 2, "c", 4, "d",
                8, "e", 3, "f", 4, "g", 7, "h", 1, "i", 5, "j", 2);

首先定義一個Comparator器,用於對Map條目進行排序。 每個條目由Map.Entry class 表示。 class 提供了方法 compareByValue comparingByValue()和 compareByKey comparingByKey()

下面的代碼說,首先按value排序,然后按key排序。 這些按自然順序排序,但以下reversed()方法表示反轉所有比較器的排序。 因此, values將按相反順序排序, keys按字母順序排序。

Comparator<Entry<String, Integer>> comp = Entry
        .<String, Integer>comparingByValue().reversed()
        .thenComparing(Entry.comparingByKey());

這會流式傳輸現有地圖的條目並將比較器應用於排序方法。 然后它將它們收集到鏈接的 hashMap 中以保留訂單。 合並 function 不參與其中,但在語法上是必需的。

Map<String, Integer> lhmap =
        map.entrySet().stream().sorted(comp)
                .collect(Collectors.toMap(Entry::getKey,
                        Entry::getValue,
                        (a, b) -> a,      // merge function
                        LinkedHashMap::new));

lhmap.entrySet().forEach(System.out::println);

該代碼打印:

a=8
d=8
g=7
i=5
c=4
f=4
e=3
b=2
j=2
h=1

HashMap不一定是有序的,實際上也不能保證鍵值對的順序會隨着時間的推移保持不變。 從文檔:

Hash 基於表的 Map 接口的實現。 此實現提供所有可選的 map 操作,並允許 null 值和 null 密鑰。 (The HashMap class is roughly equivalent to Hashtable, except that it is unsynchronized and permits nulls.) This class makes no guarantees as to the order of the map; 特別是,它不保證訂單會隨着時間的推移保持不變。

如果您想要排序的 map,請使用NavigableMapSortedMap 有幾個選項。 TreeMap可能是最簡單的。

基於紅黑樹的 NavigableMap 實現。 map 是根據其鍵的自然順序排序的,或者由 map 創建時提供的比較器排序,具體取決於使用的構造函數。

因此,要創建一個 map ,其鍵按字母降序排列,如下所示:

Comparator<String> comparator = new Comparator<>() {
    @Override
    public int compare(String o1, String o2) {      
        return o2.compareTo(o1);
    }
};

TreeMap<String, Integer> treeMap = new TreeMap<>(comparator);

這個答案是使用 java 8 個流。

//LinkedHashMap 保留插入元素的順序

LinkedHashMap<String, Integer> reverseSortedMap = new LinkedHashMap<>();
    unSortedMap.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
            .forEachOrdered(x -> reverseSortedMap.put(x.getKey(), x.getValue()));
     
    System.out.println("Reverse Sorted Map   : " + reverseSortedMap); 

暫無
暫無

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

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