首页 > 解决方案 > 从多个地图中获取重复地图键的列表

问题描述

我有多个数组映射。

Map<String, List<String>> map1 = new HashMap<>();
Map<String, List<String>> map2 = new HashMap<>();
Map<String, List<String>> map3 = new HashMap<>();
Map<String, List<String>> map4 = new HashMap<>();

我想从多个地图中获取重复地图键的列表。

例如

map1.put("k0", Arrays.asList("a0", "a1"));
map1.put("k1", Arrays.asList("b0", "b1"));

map2.put("k1", Arrays.asList("z1", "z2"));
map2.put("k2", Arrays.asList("z1", "z2"));

map3.put("k1", Arrays.asList("z1", "z2"));
map3.put("k3", Arrays.asList("z1", "z2"));

map4.put("k3", Arrays.asList("z1", "z2"));
map4.put("k4", Arrays.asList("z1", "z2"));

map5.put("k0", Arrays.asList("z1", "z2"));
map5.put("k5", Arrays.asList("z1", "z2"));

// Expected output is 
List: [k0, k1, k3]

除了遍历所有映射键,检查集合是否包含键,如果不将键添加到集合中,我想不出任何更简洁的方法来做到这一点。有没有办法用流来完成这个?

标签: javajava-stream

解决方案


因为您使用的是 java-stream 标签,所以您可以像这样解决您的问题:

Set<String> duplicateKeys = Stream.of(map1.keySet(), map2.keySet(), map3.keySet(), map4.keySet(), map5.keySet())
        .flatMap(Set::stream)
        .collect(Collectors.toMap(Function.identity(), x -> false, (a, b) -> true))
        .entrySet().stream()
        .filter(Map.Entry::getValue)
        .map(Map.Entry::getKey)
        .collect(Collectors.toSet());

输出

[k0, k1, k3]

.collect(Collectors.toMap(Function.identity(), x -> false, (a, b) -> true))这返回一个Map<String, Boolean>它返回键,true如果重复,false如果不是,那么您只需过滤以仅获取值为 true 的条目,这些条目.filter(Map.Entry::getValue)表示重复的条目。


推荐阅读