如何通过引用另一个HashMap对HashMap进行排序



我在Java中有两个HashMap

第一个包含一个键及其值。其中,second包含该键的评估索引(顺序(。我想参照第二张地图对第一张地图进行排序。

第一个哈希映射<key, value>

<"C","ccc">
<"D","ddd">
<"A","aaa">
<"B","bbb">

第二散列映射<key, value>

<"0","A">
<"1","B">
<"2","C">
<"3","D">

结果应为

<"A","aaa">
<"B","bbb">
<"C","ccc">
<"D","ddd">

循环这两个映射并检查比较键很简单,但效率不高。有什么有效的想法吗?

您可以使用Java Stream API。首先,对第二个map entry Set by key进行排序,然后将第二个maps的值映射为key,并根据第二个映射的值获得第一个map的值,然后使用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,则不需要对键进行排序。点击此处查看演示

首先,HashMap不是有序集合。HashMap中的键值对是根据键的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之间有一些比较HashMap和TreeMap之间的区别是什么?

遍历secondMap的值,并收集相关的键,在映射中设置的值:

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

最新更新