如何通过引用另一个 HashMap 对 HashMap 进行排序
How to sort HashMap by referring another HashMap
我在 Java 中有两个 HashMap
。
第一个包含键及其值。其中 second 包含该键的评估索引(顺序)。我想参考第二张图对第一张图进行排序
第一个 HashMap <key, value>
<"C","ccc">
<"D","ddd">
<"A","aaa">
<"B","bbb">
第二个 HashMap <key, value>
<"0","A">
<"1","B">
<"2","C">
<"3","D">
结果应该是
<"A","aaa">
<"B","bbb">
<"C","ccc">
<"D","ddd">
循环这两个映射并检查比较键很简单但效率不高。有什么有效的想法吗?
首先HashMap
不是有序的集合。 HashMap 中的 key-value 对根据键的 hashCode() 结果的值进行排序。所以我会说你不能在 HashMap
.
中保留排序值
相反,您可以使用 LinkedHashMap
- 它将按插入顺序排序。
对于您的解决方案,我会这样做:
HashMap<String, String> firstMap = ...
HashMap<String, String> secondMap = ...
LinkedHashMap<String, String> orderedMap = new LinkedHashMap<>();
for (int i = 0; i < secondMap.size(); ++i) {
String key = secondMap.get(String.valueOf(i));
orderedMap.put(key, firstMap.get(key));
}
没有运行这段代码,但它应该可以。
或者,您可以使用根据 Comparable
按键界面排序的 TreeMap
。
并回答哪个更好用 - TreeMap 或 LinkedHashMap - 取决于您以后实际使用此地图的方式。在大多数情况下,LinkedHashMap 就足够了,尽管如果您需要,例如,获取最接近某个键的更大的元素,那么 TreeMap 是一个选择。
HashMap和TreeMap有一些比较
What is the difference between a HashMap and a TreeMap?
遍历secondMap的values,收集map中相关的key、value集合:
Map<String, String> result = secondMap.values().stream()
.collect(Collectors.toMap(Function.identity(), firstMap::get, (x,y)-> x, LinkedHashMap::new));
试试这个:
Map<String, String> firstMap = new HashMap<>();
firstMap.put("C", "ccc");
firstMap.put("D", "ddd");
firstMap.put("A", "aaa");
firstMap.put("B", "bbb");
Map<String, String> secondMap = new HashMap<>();
secondMap.put("0", "A");
secondMap.put("1", "B");
secondMap.put("2", "C");
secondMap.put("3", "D");
Map<String, String> result = secondMap.values().stream()
.collect(Collectors.toMap(Function.identity(), firstMap::get, (x,y)-> x, LinkedHashMap::new));
System.out.println(result);
您可以使用 Java 流 API。首先,按键对第二个映射条目集进行排序,然后将第二个映射的值映射为键,并通过第二个映射的值获取第一个映射的值,然后使用 Collectors.toMap
收集为 LinkedHashMap
secondMap.entrySet().stream()
.sorted(Comparator.comparing(Map.Entry::getKey))
.collect(Collectors.toMap(Map.Entry::getValue, k -> firstMap.get(k.getValue()),
(x, y) -> y, LinkedHashMap::new));
如果您对第二张地图使用 LinkedHashMap/TreeMap 按键排序,则不需要对键进行排序。查看演示 here
我在 Java 中有两个 HashMap
。
第一个包含键及其值。其中 second 包含该键的评估索引(顺序)。我想参考第二张图对第一张图进行排序
第一个 HashMap <key, value>
<"C","ccc">
<"D","ddd">
<"A","aaa">
<"B","bbb">
第二个 HashMap <key, value>
<"0","A">
<"1","B">
<"2","C">
<"3","D">
结果应该是
<"A","aaa">
<"B","bbb">
<"C","ccc">
<"D","ddd">
循环这两个映射并检查比较键很简单但效率不高。有什么有效的想法吗?
首先HashMap
不是有序的集合。 HashMap 中的 key-value 对根据键的 hashCode() 结果的值进行排序。所以我会说你不能在 HashMap
.
相反,您可以使用 LinkedHashMap
- 它将按插入顺序排序。
对于您的解决方案,我会这样做:
HashMap<String, String> firstMap = ...
HashMap<String, String> secondMap = ...
LinkedHashMap<String, String> orderedMap = new LinkedHashMap<>();
for (int i = 0; i < secondMap.size(); ++i) {
String key = secondMap.get(String.valueOf(i));
orderedMap.put(key, firstMap.get(key));
}
没有运行这段代码,但它应该可以。
或者,您可以使用根据 Comparable
按键界面排序的 TreeMap
。
并回答哪个更好用 - TreeMap 或 LinkedHashMap - 取决于您以后实际使用此地图的方式。在大多数情况下,LinkedHashMap 就足够了,尽管如果您需要,例如,获取最接近某个键的更大的元素,那么 TreeMap 是一个选择。
HashMap和TreeMap有一些比较 What is the difference between a HashMap and a TreeMap?
遍历secondMap的values,收集map中相关的key、value集合:
Map<String, String> result = secondMap.values().stream()
.collect(Collectors.toMap(Function.identity(), firstMap::get, (x,y)-> x, LinkedHashMap::new));
试试这个:
Map<String, String> firstMap = new HashMap<>();
firstMap.put("C", "ccc");
firstMap.put("D", "ddd");
firstMap.put("A", "aaa");
firstMap.put("B", "bbb");
Map<String, String> secondMap = new HashMap<>();
secondMap.put("0", "A");
secondMap.put("1", "B");
secondMap.put("2", "C");
secondMap.put("3", "D");
Map<String, String> result = secondMap.values().stream()
.collect(Collectors.toMap(Function.identity(), firstMap::get, (x,y)-> x, LinkedHashMap::new));
System.out.println(result);
您可以使用 Java 流 API。首先,按键对第二个映射条目集进行排序,然后将第二个映射的值映射为键,并通过第二个映射的值获取第一个映射的值,然后使用 Collectors.toMap
LinkedHashMap
secondMap.entrySet().stream()
.sorted(Comparator.comparing(Map.Entry::getKey))
.collect(Collectors.toMap(Map.Entry::getValue, k -> firstMap.get(k.getValue()),
(x, y) -> y, LinkedHashMap::new));
如果您对第二张地图使用 LinkedHashMap/TreeMap 按键排序,则不需要对键进行排序。查看演示 here