【问题标题】:Java, Merge equal sized map into list of mapsJava,将大小相等的地图合并到地图列表中
【发布时间】:2021-08-30 17:45:06
【问题描述】:

有人可以帮我编写将相同大小的列表地图合并到地图列表中的代码吗?

例如:输入

Map<String, List<Object>> map = new HashMap<>();
        map.put("userid", Arrays.asList(1, 2, 3));
        map.put("username", Arrays.asList("a","b","c"));
        map.put("country", Arrays.asList("UK","IN","US"));

{country=[UK, IN, US], userid=[1, 2, 3], username=[a, b, c]}

.. 并且可以列出任意数量的地图。

所需的 JSON 输出:

[
    {"userid":1, "username":"a", "country":"UK"},
    {"userid":2, "username":"b", "country":"IN"},
    {"userid":3, "username":"c", "country":"US"}
]

我检查了这个post,但它包含所有组合。我正在寻找类似于 1:1 映射的东西。


尝试使用以下方法。可能不是正确的方法,如果有人可以提供更好的解决方案,我们将不胜感激。

    ArrayList<Object> myList = new ArrayList<>();
    int mapSize = map.get("userid").size();

    for (int i=0; i< mapSize; i++) {
        Map<String,Object> eachMap = new HashMap<>();
        for (String key : map.keySet())
            //System.out.println(key + "," + map.get(key).get(i));
            eachMap.put(key,map.get(key).get(i));
        myList.add(eachMap);
    }
    JSONArray jsonArray = new JSONArray();
    jsonArray.addAll(myList);
    System.out.println(jsonArray);

输出

[{"country":"UK","userid":1,"username":"a"},{"country":"IN","userid":2,"username":"b" },{"country":"US","userid":3,"username":"c"}]

【问题讨论】:

  • 你可以让它变得非常简单:拥有一个具有你需要的属性的模型类。然后让 one 循环遍历索引,在其中创建一个新模型,从相应的列表 [索引] 填充属性,然后添加到结果列表。完成。
  • 我对 Java 还是很陌生。我们如何从相应的 list[index] 定义和填充属性?
  • Java 还是 JavaScript?这是两个完全不同的东西。您在问题中用于地图的符号是 JavaScript,而不是 Java。
  • 对不起。我不知道确切的符号。我刚刚用正确的符号再次修改了我的问题。

标签: java


【解决方案1】:

试试这个。

public static void main(String[] args) {
    Map<String, List<Object>> map = new HashMap<>();
    map.put("userid", Arrays.asList(1, 2, 3));
    map.put("username", Arrays.asList("a","b","c"));
    map.put("country", Arrays.asList("UK","IN","US"));

    List<Map<String, Object>> output = IntStream.range(0, map.values().iterator().next().size())
        .mapToObj(i -> map.entrySet().stream()
            .map(e -> Map.entry(e.getKey(), e.getValue().get(i)))
            .collect(Collectors.toMap(Entry::getKey, Entry::getValue)))
        .toList();

    System.out.println(output);
}

输出:

[{country=UK, userid=1, username=a}, {country=IN, userid=2, username=b}, {country=US, userid=3, username=c}]

【讨论】:

  • 感谢您的回复。我尝试使用此代码并得到“错误:找不到符号符号:方法条目(字符串,对象)”。 - onlinegdb.com/1fx6qWtcF
  • 我为这个网站的 Java 版本安排了它。 GDB online Debugger | Code, Compile, Run, Debug online C, C++
  • 对我来说仍然没有运气.. :( 我已经选择了 Java,但遇到了同样的错误。我在本地的 intellij 中尝试过,“无法解析符号 'Entry'”
  • import java.util.Map.Entry;
猜你喜欢
  • 1970-01-01
  • 2020-10-19
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
  • 2017-12-23
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多