我有两个嵌套的地图,我尝试合并两个嵌套的地图并产生两个合并的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在里面。所以,我怎样才能得到合并。如何做到这一点?
答案 0 :(得分:0)
执行以下操作:
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)
,因为相同的密钥map3
替换了先前的值TEST
。
更新:根据您评论中提到的新要求添加以下更新
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}}}
答案 1 :(得分:0)
您看到的行为是正确的-即,如果您有地图并为现有键存储新值,则旧值将丢失。
这是一个简单的示例,可隔离您正在执行的操作。在此代码中,初始值"one"
将被"two"
覆盖。地图就是这样工作的。在您的情况下,您使用的是其他映射而不是简单的字符串,但是行为是相同的–您有一个值,然后将其替换为另一个值。
HashMap<String, Object> map = new HashMap<>();
map.put("TEST", "one");
map.put("TEST", "two");
要同时保留“一个”和“两个”,您需要使用不同的键(例如:“ TEST1”和“ TEST2”),或者更改存储在“ TEST”下的嵌套地图之一,或者一起引入不同的数据结构(例如java.util.Set)。