我有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以后可能会有很多元素。所以我才知道这样做的最佳方式。谢谢你的时间。
3 回答
叮当猫咪
TA贡献1776条经验 获得超12个赞
你可以用一套。与列表的 O(n) 相比,HashSet 的包含是 O(1),因此如果您经常需要运行包含,则永远不要使用列表。
Set<String> bSet = new HashSet<>(bListb); aLista.stream().filter(a -> !bSet.contains(a)).collect(Collectors.toList());
达令说
TA贡献1821条经验 获得超6个赞
如果您不关心重复项,请尝试以下操作:
Set<String> uncommon = new HashSet<>(aLista); uncommon.removeAll(bListb);
当年话下
TA贡献1890条经验 获得超9个赞
由于aLista大小非常有限并且bListb可能很大,因此您应该转换aLista为 a Set,而不是bListb.
Set<String> missing = new HashSet<>(aLista);
for (String s : bListb) {
if (missing.isEmpty())
break;
missing.remove(s);
}
bListb如果已找到所有值,该代码甚至会短路迭代,而转换bListb为 aSet将不允许这种短路逻辑。
添加回答
举报
0/150
提交
取消