我想按升序对HashMap <String [],Boolean>进行排序。我编写的这段代码可以正常工作
//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]));
我的问题是,有什么办法可以完成相同的任务?我用Google搜索它,发现了一个解决方案,它说可以使用TreeMap,但是效果不佳。
您需要将比较器传递给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
您可以尝试按键数组中的第一个元素进行排序,并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));
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句