java - 多个 ArrayLists...如何有效地查找出现在两个或多个列表中的元素?
问题描述
我有可变数量的 ArrayList。确定出现在两个或多个列表中的元素的最有效方法是什么?
例如:
[苹果、香蕉、橙子]
[猕猴桃、苹果、葡萄]
[梨、葡萄、苹果]
[蓝莓、鳄梨、猕猴桃]
我需要一个返回的函数:
[苹果、猕猴桃、葡萄]
最有效的方法是什么?我可以有数百个数组,每个数组都有数百个元素。
解决方案
如果您有数百个包含数百个元素的数组,那么您无需担心效率。即使是非常低效的解决方案,在现代硬件上也会很快完成。我建议您专注于解决方案的优雅,仅在必要时才考虑效率。
您已经说过这些是列表,所以我假设每个列表中可能有重复项 - 即如果一个项目仅在一个列表中出现两次,那么它不会被视为出现在“两个或多个列表”中。
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)
推荐阅读
- regex - Regex to match required/optional elements and nothing else
- android - Firebase Firestore 函数通知 Android
- java - 这是使用 Callable 的正确方法吗?
- c# - Catching exceptions in ASP.NET Core MVC
- javascript - 第一人称控制中的 THREE.js A 和 D 动作
- node.js - Mongoose Model.update 在我的代码中不起作用
- functional-programming - 映射时如何合并两个数组?
- node.js - 从 gitlab 将 react.js app /dist 文件夹部署到 heroku
- html - 输入类型 hidden 增加了一个中断。如何删除它们?
- php - 使用 php 检查文件夹是否存在,如果不制作一个文件上传脚本