从多个Map中获取重复Map键的列表

xn1cxnb4  于 2021-07-03  发布在  Java
关注(0)|答案(3)|浏览(518)

这个问题在这里已经有答案了

确定列表中的重复项(31个答案)
java.util.set中的重复元素(5个答案)
Java8,寻找重复元素的流(14个答案)
java.util.map的交集(6个答案)
24天前关门。
我有多张阵列图。

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

我想从多个Map中得到重复的Map键列表。
例如

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]

除了遍历所有的Map键,检查一个集合是否包含键,如果不将键添加到集合中,我想不出任何更干净的方法。有没有办法用流来实现这一点?

yzuktlbb

yzuktlbb1#

因为您使用的是java流标记,所以可以这样解决您的问题:

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` 如果不是,则只需过滤以仅获取值为真的条目 `.filter(Map.Entry::getValue)` 代表重复的。
l5tcr1uw

l5tcr1uw2#

或者,你可以试试这个。创建Map流,然后 flatMap 它将密钥流转换为密钥流,然后将密钥收集到 Map 计算每个密钥有多少个,然后流式传输该入口集, Set<Map.Entry> ,按键的出现次数过滤,将其Map到键值并收集到列表。这应该可以与 .parallel() .

private List<String> findDups(Map<String, ?>... maps) {
 return Arrays.asList(maps).stream()
  .flatMap(m->m.keySet().stream())
  .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
  .entrySet().stream()
  .filter(es->es.getValue() > 1)
  .map(es->es.getKey())
  .collect(Collectors.toList());
}
6ljaweal

6ljaweal3#

@SafeVarargs
private static Set<String> findDuplicateKeys(Map<String, ?>... maps) {
    Set<String> keys = new HashSet<>();
    return Arrays.stream(maps)
            .flatMap(map -> map.keySet().stream())
            .filter(key -> !keys.add(key))
            .collect(Collectors.toSet());
}

我将结果建模为一个集合而不是列表,因为不可能有重复的元素。

相关问题