为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

有只小跳蛙 2022-06-30 11:12:53
我有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());


查看完整回答
反对 回复 2022-06-30
?
达令说

TA贡献1821条经验 获得超6个赞

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

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


查看完整回答
反对 回复 2022-06-30
?
当年话下

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将不允许这种短路逻辑。


查看完整回答
反对 回复 2022-06-30
  • 3 回答
  • 0 关注
  • 130 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信