当前位置: 首页 > 面试题库 >

从地图列表创建地图

步弘和
2023-03-14
问题内容

我有一张地图清单。

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);
}

现在,基于与我想要的相同ID,此genericList是该列表的输入并来自此列表

Map<Integer, List<String>> mapIdResponseList

基本上,要根据ID将响应归类为String,将具有相同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);
    });
}

这将打印:

整数:1 /列表:[String1,String3]
整数:2 /列表:[ String2 ,String4]

说明(非常有必要),恐怕我无法解释每个细节,您需要首先了解Java 8中引入的StreamCollectorsAPI 的基础:

  1. Stream<Map<Integer, String>>从中获取mapList
  2. 应用flatMap运算符,该运算符将流大致映射到现有流中。
    在这里:我将全部转换Map<Integer, String>Stream<Map.Entry<Integer, String>>并将它们添加到现有流,因此现在它也是type 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对a进行操作Map.Entry并返回Integer
  6. Map<Integer, List<Map.Entry<Integer, String>>>如果不做任何额外的处理,这时我将拥有一个。
  7. 为了确保获得正确的签名,我必须在中添加一个下游,该下游必须Collectors.groupingBy提供一个收集器。
  8. 对于此下游,我使用一个收集器,该收集器通过引用将我的Map.Entry条目映射到它们的StringMap.Entry::getValue
  9. 我还需要指定如何收集它们,这只是Collectors.toList()这里,因为我想将它们添加到列表中。
  10. 这就是我们得到的Map<Integer, List,String>>


 类似资料:
  • 问题内容: 我有一张地图,其中“值”是项目列表: 我想从地图中提取项目,但仅提取1个项目列表: 我已经看到了答案,但它们不适用于我的情况。我不想要这个结果: 我想要的结果是: 如何使用JAVA 8 Streams实现此目的?谢谢。莱昂纳多。 问题答案: 感谢@Holger的回答。 在值映射中的Collection为Null的情况下避免NullPointerException的代码:

  • 我有一个模型,其中包含一个内部字段

  • 问题内容: 我想要一些排序方法: 鉴于GDK的工作方式,我希望能够做类似的事情: 但我没有在文档中看到任何内容…我缺少什么吗?还是我太懒了? 问题答案: 最近,我遇到了需要完全做到这一点的需求:将列表转换为地图。这个问题是在Groovy版本1.7.9发布之前发布的,因此该方法尚不存在。它与建议的方法完全相同 如果由于某种原因你坚持使用旧的Groovy版本,该方法也可以用这是一个经过稍微修改的版本,

  • 使用亿景智图,您可以生成自己的业务地图,并在线共享和发布这些地图,比如,客户分布图、配送路线图、布局规划图等等。生成一幅地图,基本流程是这样的:新建地图->添加图层->绘制对象(支持批量添加及使用已有数据)->发布地图。这里,为大家介绍,如何构建自定义地图: ● 新建地图 ● 上传Excel/CSV数据 ● 快速添加行政区划 ● 手动绘制地图 ● 搜索添加标注 ● 设置地图名称 ● 设定地图默认视

  • 问题内容: 我没有找到这样的多图构造…当我想这样做时,我遍历了地图,并填充了多图。还有其他方法吗? 第一个结果是,但我希望 问题答案: 假设你有 那我相信这是最好的 或更佳,但更难阅读

  • 是否可以使用Google API为网站创建一个与此完全相同的地图: https://www.google.pl/maps/place/Googleplex/@37.422,-122.0840835,19z/data=!4m2!3m1!1s0x808fba02425dad8f: 0x6c296c66619367e0 所以我想要的是将地点ID传递给API,以获得一个像Googleplex这样的地方,我