繁体   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