我有String說列表類型的列表aLista,bListb第一個(gè)列表可能有最大10 elements但bListb可能有數(shù)千甚至更多元素?,F(xiàn)在我必須找到所有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但我不確定性能,因?yàn)閎Listb以后可能會(huì)有很多元素。所以我才知道這樣做的最佳方式。謝謝你的時(shí)間。
3 回答

叮當(dāng)貓咪
TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個(gè)贊
你可以用一套。與列表的 O(n) 相比,HashSet 的包含是 O(1),因此如果您經(jīng)常需要運(yùn)行包含,則永遠(yuǎn)不要使用列表。
Set<String> bSet = new HashSet<>(bListb); aLista.stream().filter(a -> !bSet.contains(a)).collect(Collectors.toList());

達(dá)令說
TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超6個(gè)贊
如果您不關(guān)心重復(fù)項(xiàng),請(qǐng)嘗試以下操作:
Set<String> uncommon = new HashSet<>(aLista); uncommon.removeAll(bListb);

當(dāng)年話下
TA貢獻(xiàn)1890條經(jīng)驗(yàn) 獲得超9個(gè)贊
由于aLista大小非常有限并且bListb可能很大,因此您應(yīng)該轉(zhuǎn)換aLista為 a Set,而不是bListb.
Set<String> missing = new HashSet<>(aLista);
for (String s : bListb) {
if (missing.isEmpty())
break;
missing.remove(s);
}
bListb如果已找到所有值,該代碼甚至?xí)搪返D(zhuǎn)換bListb為 aSet將不允許這種短路邏輯。
添加回答
舉報(bào)
0/150
提交
取消