在列表中查找不常见元素的最佳方法

时间:2019-02-21 03:25:39

标签: java collections java-8

我有String类型的列表,例如列表aListabListb的第一个列表可能最多为10 elements,但是bListb可能有数千甚至更多元素。现在,我必须从aList中查找所有不在bListb中的元素。这是我的方法

List<String> aLista = Arrays.asList("Anil","Abhishek","Ritu");
List<String> bListb = Arrays.asList("g","o","e","Abhishek","Ritu");

List<String> result3 = aLista.stream().filter(al -> 
!bListb.contains(al)).collect(Collectors.toList());
System.out.println(result3);
// output Anil

但是我不确定性能,因为bListb稍后可能会有很多内容。所以我才刚知道这样做的最佳方法。谢谢您的时间。

3 个答案:

答案 0 :(得分:3)

您可以使用一组。 HashSet的包含比列表的O(n)为O(1),因此,如果您经常需要运行包含,则永远不要使用列表。

Set<String> bSet = new HashSet<>(bListb);
aLista.stream().filter(a -> !bSet.contains(a)).collect(Collectors.toList());

答案 1 :(得分:1)

如果您不关心重复项,请尝试以下操作:

Set<String> uncommon = new HashSet<>(aLista);
uncommon.removeAll(bListb);

答案 2 :(得分:0)

由于aLista的大小非常有限,并且bListb可能很大,因此您应该将aLista转换为Set,而不是bListb

Set<String> missing = new HashSet<>(aLista);
for (String s : bListb) {
    if (missing.isEmpty())
        break;
    missing.remove(s);
}

如果找到所有值,该代码甚至将短路bListb的迭代,而将bListb转换为Set则将不允许这种短路逻辑。