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

我有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以后可能会有很多元素。所以我才知道这样做的最佳方式。谢谢你的时间。


有只小跳蛙
浏览 131回答 3
3回答

叮当猫咪

你可以用一套。与列表的 O(n) 相比,HashSet 的包含是 O(1),因此如果您经常需要运行包含,则永远不要使用列表。Set<String>&nbsp;bSet&nbsp;=&nbsp;new&nbsp;HashSet<>(bListb); aLista.stream().filter(a&nbsp;->&nbsp;!bSet.contains(a)).collect(Collectors.toList());

达令说

如果您不关心重复项,请尝试以下操作:Set<String>&nbsp;uncommon&nbsp;=&nbsp;new&nbsp;HashSet<>(aLista); uncommon.removeAll(bListb);

当年话下

由于aLista大小非常有限并且bListb可能很大,因此您应该转换aLista为 a Set,而不是bListb.Set<String> missing = new HashSet<>(aLista);for (String s : bListb) {&nbsp; &nbsp; if (missing.isEmpty())&nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; missing.remove(s);}bListb如果已找到所有值,该代码甚至会短路迭代,而转换bListb为 aSet将不允许这种短路逻辑。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java