java - 从 map 列表创建 map

标签 java hashmap

我有一个 map 列表。

List<Map<Integer, String>>

列表中的值例如是

<1, String1>
<2, String2>
<1, String3>
<2, String4>

作为最终结果,我想要一个 map >,比如

<1, <String1, String3>>
<2, <String2, String4>>

我如何在 Java 中实现这一点。

代码:

List<Map<Integer, String>> genericList = new ArrayList<Map<Integer,String>>();
for(TrackActivity activity : activityMajor){
Map<Integer, String> mapIdResponse = activity.getMapIdResponse();
genericList.add(mapIdResponse);
}

现在这个 genericList 是这个列表的输入,基于我想要的相同 ids

Map<Integer, List<String>> mapIdResponseList

基本上,要根据 id 合并字符串响应,将具有相同 id 的响应分组到一个列表中,然后创建一个以该 id 作为键并以列表作为其值的新映射。

最佳答案

您可以使用 Java 8 执行以下操作:

private void init() {
    List<Map<Integer, String>> mapList = new ArrayList<>();

    Map<Integer, String> map1 = new HashMap<>();
    map1.put(1, "String1");
    mapList.add(map1);

    Map<Integer, String> map2 = new HashMap<>();
    map2.put(2, "String2");
    mapList.add(map2);

    Map<Integer, String> map3 = new HashMap<>();
    map3.put(1, "String3");
    mapList.add(map3);

    Map<Integer, String> map4 = new HashMap<>();
    map4.put(2, "String4");
    mapList.add(map4);

    Map<Integer, List<String>> response = mapList.stream()
            .flatMap(map -> map.entrySet().stream())
            .collect(
                    Collectors.groupingBy(
                            Map.Entry::getKey, 
                            Collectors.mapping(
                                    Map.Entry::getValue, 
                                    Collectors.toList()
                            )
                    )
            );
    response.forEach((i, l) -> {
        System.out.println("Integer: " + i + " / List: " + l);
    });
}

这将打印:

Integer: 1 / List: [String1, String3]
Integer: 2 / List: [String2, String4]

解释(非常有必要),恐怕我不能解释每一个细节,你需要了解Stream的基础知识和 Collectors Java 8 中首先引入的 API:

  1. 获得 Stream<Map<Integer, String>>来自 mapList .
  2. 申请flatMap运算符,粗略地将一个流映射到一个已经存在的流中。
    在这里:我转换所有 Map<Integer, String>Stream<Map.Entry<Integer, String>>并将它们添加到现有流中,因此现在它也是 Stream<Map.Entry<Integer, String>> 类型.
  3. 我打算收集 Stream<Map.Entry<Integer, String>>进入Map<Integer, List<String>> .
  4. 为此,我将使用 Collectors.groupingBy ,它产生一个 Map<K, List<V>>基于分组函数,Function映射 Map.Entry<Integer, String>Integer在这种情况下。
  5. 为此,我使用了一个方法引用,它完全符合我的要求,即 Map.Entry::getKey ,它在 Map.Entry 上运行并返回 Integer .
  6. 此时我会有一个 Map<Integer, List<Map.Entry<Integer, String>>>如果我没有做任何额外的处理。
  7. 为确保获得正确的签名,我必须向 Collectors.groupingBy 添加一个下游,它必须提供一个收集器。
  8. 对于这个下游,我使用一个收集器来映射我的 Map.Entry他们的条目 String通过引用的值 Map.Entry::getValue .
  9. 我还需要指定它们是如何收集的,这只是一个 Collectors.toList()在这里,因为我想将它们添加到列表中。
  10. 这就是我们得到 Map<Integer, List,String>> 的方式.

关于java - 从 map 列表创建 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22527149/

相关文章:

java - 为什么我在 Java HashMap 中得到重复的键?

c++ - 判断Unicode字符串是否在C++中具有唯一字符的最有效方法是什么?

java - 列表包含类型不安全的方法

java - 自定义 LinkedBlockingQueue 死锁

java - 在客户端(浏览器)的 Java EE Web 应用程序上播放音频

Java多对多关联映射

java.lang.RuntimeException : Found conflicting getters for name isImportantForAccessibility on class androidx. appcompat.widget.AppCompatImageView

Java HashMap 迭代 Map.Entry<> 与 Entry<>

java - 如何在 LeanFT Tool 中使用 Java 单击处理 Chrome 的 "save as"对话框?

java - Swing 不显示 unicode 字符