[英]How to merge two nested HashMaps in java
我有两个嵌套映射,我尝试合并两个嵌套映射并生成两个合并的HashMap
的输出。 下面是我使用的代码:
HashMap<String, Object> map = new HashMap<>();
HashMap<String, Object> map1 = new HashMap<>();
map1.put("location", "A");
HashMap<String, Object> map2 = new HashMap<>();
map2.put("geocoordinates", map1);
HashMap<String, Object> map3 = new HashMap<>();
map3.put("TEST", map2);
map.putAll(map3);
HashMap<String, Object> map11 = new HashMap<>();
map11.put("longitude", "B");
HashMap<String, Object> map12 = new HashMap<>();
map12.put("geocoordinates", map11);
HashMap<String, Object> map13 = new HashMap<>();
map13.put("TEST", map12);
map.putAll(map13);
System.out.println(map);
我得到的输出是:
{TEST={geocoordinates={longitude=B}}}
但我希望longitude
和location
键都嵌套在geocoordinates
键内,但只有longitude
B 存在。 那么,我怎样才能得到结合。 如何实现这一目标?
请按以下步骤操作:
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
HashMap<String, Object> map = new HashMap<>();
HashMap<String, Object> map1 = new HashMap<>();
map1.put("location", "A");
HashMap<String, Object> map2 = new HashMap<>();
map2.put("geocoordinates", map1);
HashMap<String, Object> map3 = new HashMap<>();
map3.put("TEST1", map2);
map.putAll(map3);
HashMap<String, Object> map11 = new HashMap<>();
map11.put("longitude", "B");
HashMap<String, Object> map12 = new HashMap<>();
map12.put("geocoordinates", map11);
HashMap<String, Object> map13 = new HashMap<>();
map13.put("TEST2", map12);
map.putAll(map13);
System.out.println(map);
}
}
输出:
{TEST2={geocoordinates={longitude=B}}, TEST1={geocoordinates={location=A}}}
原因:当您将新值放在同一个键上时, Map
替换旧值(在您的情况下,它是TEST
)。 请注意HashMap.putAll()
所有映射从一个映射复制到另一个映射。 在您的代码中, map.putAll(map3)
相当于map.put("TEST",map3)
。 而且, map.putAll(map13)
等价于map.put("TEST",map13)
因为相同的键TEST
替换了较早的值map3
。
更新:根据您评论中提到的新要求添加以下更新
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class Main {
public static void main(String[] args) {
HashMap<String, Object> map = new HashMap<>();
List<HashMap> list=new ArrayList<HashMap>();
HashMap<String, Object> map1 = new HashMap<>();
map1.put("location", "A");
list.add(map1);
HashMap<String, Object> map11 = new HashMap<>();
map11.put("longitude", "B");
list.add(map11);
HashMap<String, Object> map2 = new HashMap<>();
map2.put("geocoordinates", list);
map.put("TEST",map2);
System.out.println(map);
}
}
输出:
{TEST={geocoordinates=[{location=A}, {longitude=B}]}}
另一种方法如下:
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
HashMap<String, Object> map1 = new HashMap<>();
map1.put("location", "A");
map1.put("longitude", "B");
HashMap<String, Object> map2 = new HashMap<>();
map2.put("geocoordinates", map1);
HashMap<String, Object> map = new HashMap<>();
map.put("TEST", map2);
System.out.println(map);
}
}
输出:
{TEST={geocoordinates={location=A, longitude=B}}}
您看到的行为是正确的 - 即,如果您有一个地图并为现有键存储新值,则旧值将丢失。
这是一个简单的例子,它隔离了你正在做的事情。 在这段代码中,初始值"one"
将被"two"
覆盖。 这就是地图的工作方式。 在您的情况下,您使用的是其他映射而不是简单的字符串,但行为是相同的 - 您有一个值,并且正在用另一个值替换它。
HashMap<String, Object> map = new HashMap<>();
map.put("TEST", "one");
map.put("TEST", "two");
要同时保留“一”和“二”,您需要使用不同的键(例如:“TEST1”和“TEST2”),或者更改存储在“TEST”下的嵌套映射之一,或者引入完全不同的数据结构(例如java.util.Set )。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.