【问题标题】:Properly Merge of 2 or more Hashmaps with multiple values from each key正确合并 2 个或多个 Hashmap,每个键具有多个值
【发布时间】:2018-09-16 22:52:56
【问题描述】:

我正在寻找一种方法在 1 中正确合并 2 个或更多哈希图,在这种特定情况下,我想将 2 个或更多带有许多键的哈希图与他各自的值在这种情况下大于 1。像(键(i), value1, value2, ... valueN)

我的代码:

int f =0;

while (f < Response.size()) {

map3.putAll(Response.get(f).getUsers());

f = f + 1;}

其中 Response 是我保存 json 的类,而 Users 是我在该类中定义的 HashMap,当然在 Map Users 中我有获取器来映射诸如 users.getName、users.getDescription、users 之类的值。获取年龄

代码:

public class Response {

 private Map<String, Users> users = new LinkedHashMap<>();

 public Map<String, ProductsBean> getusers() {return users;}

  public static class Users {

        private String name;
        private String description;
        private String age;

      public String getName() {return name;}
      public String getDescription() {return description;}
      public String getAge() {return age;} }

我需要合并所有地图,因为我需要发送到适配器。

【问题讨论】:

  • 请说明输入映射的类型以及您希望结果映射具有的类型,包括键和值。

标签: java android json hashmap


【解决方案1】:

我不确定我是否正确理解了您的代码,因为 getUsers 看起来不会返回 Map

但是,我可以帮助您合并两个地图,如下所示:

import static org.junit.Assert.assertEquals;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.junit.Test;

public class ExampleTest {

    @Test
    public void test() {

        // Create maps to combine
        Map<String, String> mapA = new LinkedHashMap<>();
        Map<String, String> mapB = new LinkedHashMap<>();

        // Create final map
        Map<String, List<String>> mapC = new LinkedHashMap<>();

        // Add data to input mapA
        mapA.put("A", "value1");
        mapA.put("B", "value2");

        // Add data to input mapB
        mapB.put("C", "Happy");
        mapB.put("B", "Sad");

        // Fill results from mapA
        mapC = populateMapCWithMapContent(mapC, mapA);
        mapC = populateMapCWithMapContent(mapC, mapB);

        // Check Results
        assertEquals(2, mapA.size());
        assertEquals(2, mapB.size());
        assertEquals(3, mapC.size());

        // show results
        for (String key : mapC.keySet()) {
            System.out.println("Key=" + key);
            List<String> values = mapC.get(key);
            for (String value : values) {
                System.out.println("    Value = " + value);
            }
        }

    }

    /**
     * Populate mapC with provided map Contents
     * 
     * @param mapC
     *            - resulting map
     * @param map
     *            - input data
     * @return mapC
     * 
     *         Note: this would work with a void, but I always feel that if mapC is
     *         changed, then mapC should be returned (To help readability). 
     */
    private Map<String, List<String>> populateMapCWithMapContent(Map<String, List<String>> mapC,
            Map<String, String> inputMap) {
        List<String> mapCValues;
        for (String key : inputMap.keySet()) {
        if (mapC.containsKey(key)) {
                mapCValues = mapC.get(key);
            } else {
                mapCValues = new ArrayList<String>();
            }
            mapCValues.add(inputMap.get(key));
            mapC.put(key, mapCValues);
        }
        return mapC;
    }
}

提供以下结果:

Key=A
    Value = value1
Key=B
    Value = value2 
    Value = Sad
Key=C 
    Value = Happy

请注意,mapA 和 mapB 仅包含 String 值,但由于组合映射 (mapC) 需要为单个键保存多个值,因此我使用了 List。 也可以包含另一个地图而不是字符串。例如

Map<String, LinkedHashMap<String,Object>> mapC = new LinkedHashMap<>();

【讨论】:

  • 嗨,我有一个 JsonArray,响应中有许多对象,但在每个对象内部我都有用户列表,为什么我要映射用户对象问题是我需要将所有用户合并到一个地图中或列表,示例对象 1 (Users1) - Object 2 (Users 2) - ... ObjectN (Users N),考虑到我有 1 个键(用户 ID)和每个键的多个值,我需要将所有用户合并到 1 个地图中用户属性(id、姓名、年龄...)。
猜你喜欢
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-22
  • 2021-09-10
  • 1970-01-01
  • 2013-05-04
相关资源
最近更新 更多