简体   繁体   English

如何按升序对地图字符串列表进行排序

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

I have a list of HashMap and I want to sort it in ascending order in Java. 我有一个HashMap列表,我想在Java中按升序对其进行排序。

I am using custom Comparator to implement the logic, but its failing. 我正在使用自定义比较器来实现逻辑,但是失败了。 Its just grouping the list based on Map keys. 它只是基于Map键对列表进行分组。 Its not sorting the list entirely. 它没有对列表进行完全排序。

My Code looks like- 我的代码看起来像-

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;
    }

}

It prints the output- 它输出输出-

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

It groups the values by key, but I want the entire sorted list like in the above example. 它按键对值进行分组,但是我希望像上面的示例一样整个排序列表。

I was expecting 2 and then 3, then 4 and go on. 我期望2,然后3,然后4,然后继续。

You're comparing based on the keys which are of type String . 您正在基于String类型的键进行比较。 Comparison will be done lexicographically, ie 12 is less than 2 . 比较将按词典顺序进行,即12小于2

You need to compare the keys as Integers in the comparator: 您需要在比较器中将键比较为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));
    }
});

Just modify your comparator converting the key string to an integer: 只需修改您的比较器,即可将密钥字符串转换为整数:

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