簡體   English   中英

如何對每個包含多個鍵值對的 HashMap 的 ArrayList 進行排序?

[英]How sort an ArrayList of HashMaps holding several key-value pairs each?

我需要使用 HashMap 的 ArrayList 調用外部 API,每個 HashMap 包含幾個預定義的鍵值對。 一個例子:

ArrayList<HashMap<String, String>> arrayListHashMap = new ArrayList<HashMap<String, String>>();

    {
        HashMap hashMap = new HashMap<String, String>();
        hashMap.put("key", "A key");
        hashMap.put("value", "B value");
        arrayListHashMap.add(hashMap);
    }

    {
        HashMap hashMap = new HashMap<String, String>();
        hashMap.put("key", "B key");
        hashMap.put("value", "A value");
        arrayListHashMap.add(hashMap);
    }

現在我需要根據“value”鍵的內容對這個構造進行排序。 這種排序將導致“key=B key/value=A value”條目作為arrayListHashMap 中的第一個條目。

任何幫助都受到高度贊賞。

華建華

您需要實現一個Comparator<HashMap<String, String>>或更一般的Comparator<Map<String, String>> ,它只是提取與value鍵關聯的value ,然后使用Collections.sort 示例代碼(對要排序的任何鍵進行泛化):

class MapComparator implements Comparator<Map<String, String>>
{
    private final String key;

    public MapComparator(String key)
    {
        this.key = key;
    }

    public int compare(Map<String, String> first,
                       Map<String, String> second)
    {
        // TODO: Null checking, both for maps and values
        String firstValue = first.get(key);
        String secondValue = second.get(key);
        return firstValue.compareTo(secondValue);
    }
}

...
Collections.sort(arrayListHashMap, new MapComparator("value"));

您可以使用以下解決方案來實現它:

arrayListHashMap.sort(Comparator.comparing(m -> m.get("value"), Comparator.nullsLast(Comparator.naturalOrder())));

(這不是對所問問題的回答 - Jon 已經這樣做了 - 但評論字段太小了。)

您的數據結構看起來好像您誤解了映射的鍵值結構(以及示例中的哈希映射)。

Map 可以包含任意數量的鍵,並且每個鍵還有一個值。 一對鍵和值由Map.Entry給出(可以通過映射的entrySet()方法獲得)。 如果您想按鍵排序,只需使用 SortedMap(如 TreeMap)而不是通常的 HashMap。

您正在每個 HashMap 模擬單個條目,然后將它們全部放入 ArrayList ... :-/

這是我在你的例子中所做的:

Map<String, String> map = new TreeMap<String, String>();
map.put("B key", "B value");
map.put("A key", "B value");

System.out.println(map); // already sorted

暫無
暫無

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

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