首页 > 解决方案 > 多个 ArrayLists...如何有效地查找出现在两个或多个列表中的元素?

问题描述

我有可变数量的 ArrayList。确定出现在两个或多个列表中的元素的最有效方法是什么?

例如:

[苹果、香蕉、橙子]

[猕猴桃、苹果、葡萄]

[梨、葡萄、苹果]

[蓝莓、鳄梨、猕猴桃]

我需要一个返回的函数:

[苹果、猕猴桃、葡萄]

最有效的方法是什么?我可以有数百个数组,每个数组都有数百个元素。

标签: java

解决方案


如果您有数百个包含数百个元素的数组,那么您无需担心效率。即使是非常低效的解决方案,在现代硬件上也会很快完成。我建议您专注于解决方案的优雅,仅在必要时才考虑效率。

您已经说过这些是列表,所以我假设每个列表中可能有重复项 - 即如果一个项目仅在一个列表中出现两次,那么它不会被视为出现在“两个或多个列表”中。

List<List<String>> input;
Map<String,Long> occurrences = input.stream()
    .flatMap(l -> l.stream().distinct())
    .collect(Collectors.groupingBy(l -> l, Collectors.counting()));

这将计算包含每个项目的列表数。您可以获得所有出现 2 次或更多的项目occurrences.keySet().stream().filter(i -> occurrences.get(i) > 1)


推荐阅读