比较Java中缺少和多余的两个列表和输出元素



我有两个字符串列表列表A和B。列表可能有相同的长度,或者其中一个比另一个长。每个列表中没有重复的值。它们由随机数组成。

我想做的是找到与列表B相比,A中存在的缺失和额外元素。并将它们保存在两个新列表中,一个用于缺失元素,另一个用于额外元素。

例如:

A = ["3000047" , "3000042" , "3000030"  , "30000475"]
B = ["3000047" , "3000043" , "3000030" ]

输出应为

Missing = ["3000043"]
Extra = ["3000042" , "30000475"]

我想在下面做。但不确定性能和效率。

  1. 从A中读取元素
  2. 检查B中是否存在元素
  3. 如果没有,请将其添加到"额外"列表中
  4. 如果是,则从A和B中移除元件
  5. 如果B为空,则在"额外"列表中添加所有重命名元素
  6. 如果A为空,则在"缺少"列表中添加所有重命名元素

但不确定的性能及其效率

性能方面,请使用Set(HashSet实现(而不是List。这将在以下条件下提供更好的O时间复杂性:

  1. 检查元素是否存在于B中

此时将应用contains方法。请查看此答案以了解详细信息。

与列表的O(n)相比,HashSet的Contains是O(1),因此,如果经常需要运行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]

最新更新