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

生成一个Map,其中包含两个map Map中包含的值的联合

凤高澹
2023-03-14

我有两个map参数:Map

我正在寻找一种方法来编写一个计算它们的并集的函数。我的意思是,对于任何X x,如果它在map1的域中,但不在map2的域中,那么它的值将是map1.get(x)。相反的情况相同。如果它在两者中,那么我想返回一个集合,它是map1.get(x)map2.get(x)的交集。

假设我知道X是哪个类,可以使用以下代码完成此操作:

public Map<X,Set<Y>> unifyAndIntersect(Map<X,Set<Y>> map1, Map<X,Set<Y>> map2) {
    Map<X,Set<Y>> combined = new HashMap();
    combined.putAll(map1);
    for(X x : map2.keySet()){
          if(combined.contains(x)){
                Set<Y> res = Sets.newSet();
                res.addAll(map1.get(x));
                res.retainAll(map2.get(x));
                combined.put(x,res);
          }
          else{
                combined.put(x,map2.get(x));
          }
    }
}

但是,我想使这个方法通用,从某种意义上说,它适用于任何XY。我尝试过使用Object,但从我的类类型转换为Object时出错...

你能告诉我做这件事的正确方法吗?


共有1个答案

郎项禹
2023-03-14

为了声明泛型方法,需要提供泛型类型参数

别忘了钻石

您提供的代码中还有一个不一致之处:如果一个键存在于两个映射中,则会将一个新集作为值添加到结果映射中,但如果根据您的代码,该键仅包含在其中一个映射中,则会使用现有集。我最好为每个值生成一个新的集,以确保随后对结果图的值进行的修改不会影响map1和map2的状态。

public <X,Y> Map<X, Set<Y>> unifyAndIntersect(Map<X,Set<Y>> map1,
                                              Map<X,Set<Y>> map2) {
    
    Map<X, Set<Y>> combined = new HashMap<>();
    for(Map.Entry<X, Set<Y>> entry: map1.entrySet()){
        Set<Y> union = new HashSet<>(entry.getValue());
        if (map2.containsKey(entry.getKey())) {
            union.addAll(map2.get(entry.getKey()));
        }
        combined.put(entry.getKey(), union);
    }
    return combined;
}

可以使用流API实现相同的逻辑

public <X,Y> Map<X, Set<Y>> unifyAndIntersect(Map<X,Set<Y>> map1,
                                              Map<X,Set<Y>> map2) {
    return map1.entrySet().stream()
        .map(entry -> Map.entry(entry.getKey(),
                                Stream.of(entry.getValue(), 
                                          map2.get(entry.getKey()))
                    .filter(Objects::nonNull)
                    .flatMap(Set::stream)
                    .collect(Collectors.toSet())))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}

 类似资料:
  • 问题内容: 我们创建了一些我们所有项目都将使用的库,该库将提供我们所有系统的基本功能(登录,某些管理等)。但是应用程序本身可以使用另一个数据库。 我们要做的是用两个持久性单元创建Persistence.xml。并将所有核心库实体打包在一个名为“ LN- model.jar”的jar中,并将所有测试应用程序的实体打包在“ App-model.jar”中。但是由于某种原因,我们仍然会收到以下消息。 无

  • 下面我有两个箱子。 案例1和案例2之间的区别在于案例2具有在中,但案例1在中具有。 问题是关于案例2的输出:为什么包含两个不同的值,一个是,另一个是字符串“B”?

  • 我需要一些帮助来替换HashMap中的值。HashMap包含每个键的多个值,这些值是从ArrayList中添加的。我想做的是替换键中的一个元素。例如,用户输入键1和索引2,这将是该键的值[1]=[A, B, C, D],索引2将是字母“C”,我想用“X”替换它,这样输出将是[1]=[A, B, X, D],这将在一个同时循环中。 输出: 1 张 AB 光盘 2 张 AB 光盘 3 张 AB 光盘

  • 如何查询同时包含键值对“key1”-“value1”和“key2”-“value2”的文档?我似乎找不到关于这个的任何文件。 我尝试了下面的查询,但它没有返回任何结果,即使应该有匹配的文档。虽然用should替换must是可行的,但当我将minimum_should_match=100%时,它也不会返回任何结果。 这是映射的外观: 非常感谢你的帮助。

  • 使用Tomcat 7.0.34、Primefaces 3.5和mojarra 2.1.25,我得到了以下文件“client.xhtml”: 文件client.inc(这是一个普通的xhtml,在几个xhtml文件中使用)如下:(简化) 和“客户端比林.inc”:(我在其他几个xhtml文件中使用) “clientBilling.inc”中的选项卡没有显示,但如果我将其从p:tabView上取下,就