簡體   English   中英

如何按升序對地圖字符串列表進行排序

[英]How to sort List of Map String in ascending order

我有一個HashMap列表,我想在Java中按升序對其進行排序。

我正在使用自定義比較器來實現邏輯,但是失敗了。 它只是基於Map鍵對列表進行分組。 它沒有對列表進行完全排序。

我的代碼看起來像-

public class ListMap {

    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        List<HashMap<String, String>> list = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            int value = randInt(1, 20);
            long timeInMillis = cal.getTimeInMillis();
            HashMap<String, String> mp = new HashMap<>();
            mp.put("" + value, "Values" + value + ":" + timeInMillis);
            list.add(mp);
        }

        Collections.sort(list, new Comparator<Map<String, String>>() {
            @Override
            public int compare(Map<String, String> map1,
                    Map<String, String> map2) {
                String val1 = "";
                String val2 = "";
                for (Map.Entry<String, String> entry : map1.entrySet()) {
                    val1 = entry.getKey();
                }
                for (Map.Entry<String, String> entry : map2.entrySet()) {
                    val2 = entry.getKey();
                }
                return val1.compareTo(val2);
            }
        });

        for (Map<String, String> hashMap : list) {
            for (Map.Entry<String, String> entry : hashMap.entrySet()) {
                System.out.println(entry.getKey() + "/" + entry.getValue());
            }
        }

    }

    public static int randInt(int min, int max) {
        Random rand = new Random();
        int randomNum = rand.nextInt((max - min) + 1) + min;

        return randomNum;
    }

}

它輸出輸出-

10/Values10:1437660285301
11/Values11:1437660285301
11/Values11:1437660285301
11/Values11:1437660285301
13/Values13:1437660285301
13/Values13:1437660285301
15/Values15:1437660285301
15/Values15:1437660285301
15/Values15:1437660285301
16/Values16:1437660285301
17/Values17:1437660285301
18/Values18:1437660285301
18/Values18:1437660285301
19/Values19:1437660285301
19/Values19:1437660285301
2/Values2:1437660285301
3/Values3:1437660285301
4/Values4:1437660285301
6/Values6:1437660285301
6/Values6:1437660285301

它按鍵對值進行分組,但是我希望像上面的示例一樣整個排序列表。

我期望2,然后3,然后4,然后繼續。

您正在基於String類型的鍵進行比較。 比較將按詞典順序進行,即12小於2

您需要在比較器中將鍵比較為Integers

Collections.sort(list, new Comparator<Map<String, String>>() {
    @Override
    public int compare(Map<String, String> map1,
             Map<String, String> map2) {
        String val1 = "";
        String val2 = "";
        for (Map.Entry<String, String> entry : map1.entrySet()) {
            val1 = entry.getKey();
        }
        for (Map.Entry<String, String> entry : map2.entrySet()) {
            val2 = entry.getKey();
        }

        return Integer.valueOf(val1).compareTo(Integer.valueOf(val2));
    }
});

只需修改您的比較器,即可將密鑰字符串轉換為整數:

new Comparator<Map<String, String>>() {
     @Override
     public int compare(Map<String, String> map1,
             Map<String, String> map2) {
        String val1 = "";
        String val2 = "";
        for (Map.Entry<String, String> entry : map1.entrySet()) {
             val1 = entry.getKey();
        }
        for (Map.Entry<String, String> entry : map2.entrySet()) {
             val2 = entry.getKey();
        }

        int key1 = Integer.parseInt(val1);
        int key2 = Integer.parseInt(val2);
        return key1.compareTo(key2);
     }
}

暫無
暫無

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

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