[英]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.