当前位置: 首页 > 知识库问答 >
问题:

合并映射

逑和蔼
2023-03-14

我想合并两个地图与JAVA 8流:

Map<String, List<String>> mapGlobal = new HashMap<String, List<String>>();
Map<String, List<String>> mapAdded = new HashMap<String, List<String>>();

我尝试使用以下实现:

mapGlobal = Stream.of(mapGlobal, mapAdded)
                .flatMap(m -> m.entrySet().stream())
                .collect(Collectors.groupingBy(Map.Entry::getKey,
                        Collectors.mapping(Map.Entry::getValue,        
                                           Collectors.toList())
                ));

但是,此实现只会产生如下结果:

地图

如果mapGlobal中不包含一个键,则该键将与相应的字符串列表一起添加为新键。如果键在mapGlobalmapAdded中重复,两个值列表将合并为:A={1,3,5,7}B={1,2,4,6},然后A∪ B={1,2,3,4,5,6,7}


共有3个答案

满博
2023-03-14

原始实现不会创建类似Map的结果

仲涵亮
2023-03-14

使用Foreach over Map可以用来合并给定的数组列表。

    public Map<String, ArrayList<String>> merge(Map<String, ArrayList<String>> map1, Map<String, ArrayList<String>> map2) {
    Map<String, ArrayList<String>> map = new HashMap<>();
    map.putAll(map1);

    map2.forEach((key , value) -> {
        //Get the value for key in map.
        ArrayList<String> list = map.get(key);
        if (list == null) {
            map.put(key,value);
        }
        else {
            //Merge two list together
            ArrayList<String> mergedValue = new ArrayList<>(value);
            mergedValue.addAll(list);
            map.put(key , mergedValue);
        }
    });
    return map;
}
仇正平
2023-03-14

您可以通过迭代mapAdded中的所有条目并将它们合并到mapGlobal中来实现这一点。

下面通过调用foreach(action)遍历mapAdded的条目,其中操作使用每个条目的键和值。对于每个条目,我们在mapGlobal上调用合并(key,value,remappingFunction):如果键不存在,这将在键k和值v下创建条目,或者调用如果它们已经存在,则赋予重映射函数。这个函数需要合并两个列表,在这种情况下,首先添加到TreeSet中,以确保元素的唯一性和排序,并将其转换回列表:

mapAdded.forEach((k, v) -> mapGlobal.merge(k, v, (v1, v2) -> {
    Set<String> set = new TreeSet<>(v1);
    set.addAll(v2);
    return new ArrayList<>(set);
}));

如果您想并行运行,可以通过获取entrySet()并对其调用parallelStream()来创建流管道。但是,您需要确保使用支持mapGlobal并发的映射,比如ConcurrentHashMap

ConcurrentMap<String, List<String>> mapGlobal = new ConcurrentHashMap<>();
// ...
mapAdded.entrySet().parallelStream().forEach(e -> mapGlobal.merge(e.getKey(), e.getValue(), (v1, v2) -> {
    Set<String> set = new TreeSet<>(v1);
    set.addAll(v2);
    return new ArrayList<>(set);
}));

 类似资料:
  • 我有一个简单的api请求,它向一个对象返回一个可观察的对象,该对象中有一组项,每个项中都有一个链接。因此,我想在当前异步流中直接获取链接后面的数据,但我收到一个CORS错误,错误是: 这是否可能与我当前的函数?还是我误解了一些基本概念?

  • 问题 现在有多个字典或者映射,你想将它们从逻辑上合并为一个单一的映射后执行某些操作, 比如查找值或者检查某些键是否存在。 解决方案 假如你有如下两个字典: a = {'x': 1, 'z': 3 } b = {'y': 2, 'z': 4 } 现在假设你必须在两个字典中执行查找操作(比如先从 a 中找,如果找不到再在 b 中找)。 一个非常简单的解决方案就是使用 collections 模块中的

  • 我有一个列为col1、col2、col3的数据帧。col3是下面定义的映射[String,String] 我按col1、col2进行分组,并使用collect_list进行聚合,以获得映射数组并存储在col4中。 然而,我希望将col4作为一个单独的映射,并将所有映射合并。目前我有: 预期输出 使用udf是否理想? 感谢您的帮助。谢谢

  • 假设我有一个类的,每个类都有一个。 中的键是时间戳,值是分数。 我试图创建一个,它可以组合所有对象的地图,并输出带有唯一时间戳(Thes)和平均分数的。 我有这个代码,但它给我所有分数的总和,而不是平均值(类没有平均值方法)。 我想这可能不是一个简单的问题,所以在一个单一的中解决,所以一个带有唯一时间戳的和所有分数的的输出也可以。然后我可以自己计算平均值。 它它可能吗?

  • 本文向大家介绍Python如何合并多个字典或映射,包括了Python如何合并多个字典或映射的使用技巧和注意事项,需要的朋友参考一下 问题 现在有多个字典或者映射,你想将它们从逻辑上合并为一个单一的映射后执行某些操作,比如查找值或者检查某些键是否存在。 解决方案 加入你有如下两个字典: 现在假设你必须在两个字典中执行查找操作(比如先从a中找,如果找不到再在b中找)。一个非常简单扼解决方案就是使用co