簡體   English   中英

如何在java中合並兩個嵌套的HashMap

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

但我希望longitudelocation鍵都嵌套在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM