我有String
类型的列表,例如列表aLista
和bListb
的第一个列表可能最多为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
稍后可能会有很多内容。所以我才刚知道这样做的最佳方法。谢谢您的时间。
答案 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
则将不允许这种短路逻辑。