如何在Java中合并两个嵌套的HashMap

时间:2019-12-19 19:13:11

标签: java hashmap

我有两个嵌套的地图,我尝试合并两个嵌套的地图并产生两个合并的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在里面。所以,我怎样才能得到合并。如何做到这一点?

2 个答案:

答案 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)。