java - 如何按升序对映射字符串列表进行排序

标签 java sorting

我有一个 HashMap 列表,我想在 Java 中按升序对其进行排序。

我正在使用自定义比较器来实现逻辑,但它失败了。它只是根据映射键对列表进行分组。它没有完全对列表进行排序。

我的代码看起来像-

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

关于java - 如何按升序对映射字符串列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31589854/

相关文章:

java - 查找 2 个 csv 文件差异的有效方法

java - 使用 Mockito/PowerMockito 模拟父类(super class)的公共(public)方法

javascript - 在数组中按数组排序对象?

java - 在这种情况下我应该使用哪种排序算法?

java - 什么是原始类型,为什么我们不应该使用它呢?

java - 一对多关联的二级缓存

java - Jersey 总是返回 404

python - Python 中字符串的基数排序

python - 我可以在 Jython 中使用 from __future__ 导入排序吗?

php - 按 W/YYYY 日期格式排序