java - 比较两个列表并输出Java中的缺失和额外元素
问题描述
我有两个字符串列表 A 和 B。列表的长度可能相同,或者一个比另一个长。每个列表中没有重复的值。它们由随机数组成。
我想要做的是找到与列表 B 相比 A 中存在的缺失和额外元素。并将它们保存在两个新列表中,一个用于缺失元素,一个用于额外元素。
例如 :
A = ["3000047" , "3000042" , "3000030" , "30000475"]
B = ["3000047" , "3000043" , "3000030" ]
输出应该是
Missing = ["3000043"]
Extra = ["3000042" , "30000475"]
我想在下面做。但不确定性能及其效率。
- 从 A 中读取元素。
- 检查 B 中是否存在元素。
- 如果没有,则将其添加到额外列表中。
- 如果是,则从 A 和 B 中删除该元素。
- 如果 B 为空,则在 Extra 列表中添加所有重命名元素。
- 如果 A 为空,则在缺失列表中添加所有重命名元素。
解决方案
但不确定性能及其效率
性能方面,使用Set
( HashSet
implementation) 而不是List
. 这将在以下位置提供更好O
的时间复杂度:
- 检查 B 中是否存在元素。
这是您应用contains
方法的时候。检查此答案以获取详细信息。
将包含用于 a与用于列表
HashSet
进行比较,因此如果您经常需要运行,则永远不要使用列表。O(1)
O(n)
contains
您提出的算法可以使用 Java 内置函数来实现。
Set#removeAll
Set<String> A = new HashSet<>(Arrays.asList("3000047", "3000042", "3000030", "30000475"));
Set<String> B = new HashSet<>(Arrays.asList("3000047", "3000043", "3000030"));
Set<String> copyA = new HashSet<>(A);
Set<String> copyB = new HashSet<>(B);
copyB.removeAll(A);
System.out.println("Missing: " + copyB);
copyA.removeAll(B);
System.out.println("Extra: " + copyA);
输出
Missing: [3000043]
Extra: [3000042, 30000475]
推荐阅读
- tableau-api - Tableau 命令行 - 导出季度文件
- python - 如何在列表中对字典进行排序?
- spring-webflux - 继续 zip(),如果一个源已完成
- javascript - 合并两个数组而不覆盖
- matlab - 如何使用 Matlab 读取 3D 文件中的颜色?
- python - 来自外部库的代码覆盖率 python
- powershell - PowerShell Where-Object - 没有返回 - 我一定做错了什么
- javascript - 通过通配符匹配 URL
- python - 在python中为每一天(来自单个时间序列)创建新列
- kotlin - 如何将键和值添加到 Kotlin 中列表的映射?