【问题标题】:sort HashMap<String[], Boolean> by name which is present in String[] in ascending order [duplicate]按名称对 HashMap<String[], Boolean> 进行排序,该名称在 String[] 中按升序排列 [重复]
【发布时间】:2018-01-07 06:51:49
【问题描述】:

我想按升序对 HashMap 进行排序。它适用于我编写的这段代码

//HashMap<String[], Boolean> literalTable = new HashMap<>(); // declared some where in my code
ArrayList<String[]> arrayList = new ArrayList<>();
    for (int i = 0; i < literalTable.size(); ++i){
        String[] str = {};
        arrayList.add(str);
    }
    for (Map.Entry m: literalTable.entrySet()){
        String[] str = (String[]) m.getKey();
        Integer index = Integer.parseInt(str[0]);
        arrayList.set(index, str);
    }

    arrayList.sort(Comparator.comparing(p -> p[0]));

我的问题是,有什么方法可以完成同样的任务吗? 我用谷歌搜索并找到了一个解决方案,它说您可以使用 TreeMap,但效果不佳。

【问题讨论】:

  • 您想按字符串数组中的 0 索引值对地图进行排序吗?
  • 是的,名字出现在第一个索引中
  • 您可以使用TreeMapLinkedHashMap 来获得有序条目,查看使用两者发布的答案

标签: java sorting hashmap


【解决方案1】:

您需要将比较器传递给TreeMap 构造函数以对数组字符串进行排序

Map<String[], Boolean> hashMap = new HashMap<String[], Boolean>();
hashMap.put(new String[]{"bfa", "asdfs", "gr"}, true);
hashMap.put(new String[]{"efd", "asdfs", "gr"}, true);
hashMap.put(new String[]{"asd", "asdfs", "gr"}, true);
hashMap.put(new String[]{"bfd", "asdfs", "gr"}, true);

TreeMap<String[], Boolean> treeMap = new TreeMap<>(Comparator.comparing(a -> a[0]));
treeMap.putAll(hashMap);
treeMap.forEach((k, v) -> System.out.println(Arrays.toString(k) + " " + v));

输出

[asd, asdfs, gr] true
[bfa, asdfs, gr] true
[bfd, asdfs, gr] true
[efd, asdfs, gr] true

您可以尝试按key数组中的第一个元素排序,并使用LinkedHashMap维护顺序

        LinkedHashMap<String[], Boolean> orderedMap = hashMap.keySet().stream()
                .sorted(Comparator.comparing(a -> a[0])) // ignore case if required
                .collect(Collectors.toMap(a -> a, a -> hashMap.get(a), (a, b) -> a, LinkedHashMap::new));
        orderedMap.forEach((k, v) -> System.out.println(Arrays.toString(k) + " " + v));

输出

[asd, asdfs, gr] true
[bfa, asdfs, gr] true
[bfd, asdfs, gr] true
[efd, asdfs, gr] true

如果您需要按下一个元素排序,如果第一个元素匹配,您可以将数组连接到字符串并进行排序

LinkedHashMap<String[], Boolean> orderedMap = hashMap.keySet().stream()
                .sorted(Comparator.comparing(a -> Arrays.toString(a))) // ignore case if required
                .collect(Collectors.toMap(a -> a, a -> hashMap.get(a), (a, b) -> a, LinkedHashMap::new));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    相关资源
    最近更新 更多