亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

兩個列表按對象屬性的交集

兩個列表按對象屬性的交集

慕工程0101907 2023-05-10 13:58:49
如果我有兩個對象列表,我可以按如下方式找到交集:public class MyObject {     String id;     String someField;     String someOtherField;}List<MyObject> list1;List<MyObject> list2;List<MyObject> intersect = list1.stream()                           .filter(list2::contains)                           .collect(Collectors.toList());id是否有類似的方法可以根據的領域找到交集MyObject?我無法覆蓋 equals 方法。
查看完整描述

4 回答

?
楊魅力

TA貢獻1811條經驗 獲得超6個贊

與上面 Eran 的回答類似,但效率可能稍高一些,您可以先將 ID 拉出到一個單獨的 Set 中:

Set<String> ids = list2.stream().map(obj -> obj.id).collect(Collectors.toSet());

List<MyObject> intersect = list1.stream()
    .filter(obj -> ids.contains(obj.id))
    .collect(Collectors.toList());

這會更有效的原因是,對于每個項目,list1您可以確定 ID 是否在list2O(1) 時間內,因此總體而言,您的運行時間為 O(list1 + list2)


查看完整回答
反對 回復 2023-05-10
?
函數式編程

TA貢獻1807條經驗 獲得超9個贊

您可以嘗試這種方法。但我認為這對性能沒有好處:

List<MyObject> intersect = list1.stream()
                       .filter(l1 -> list2.stream().anyMatch(l2 -> l2.id.equals(l1.id)))
                       .collect(Collectors.toList());


查看完整回答
反對 回復 2023-05-10
?
POPMUISE

TA貢獻1765條經驗 獲得超5個贊

是的:

List<MyObject> intersect =
    list1.stream()
         .filter(obj1 -> list2.stream().map(MyObject::getId).anyMatch(id -> id.equals(obj1.getId()))
         .collect(Collectors.toList());

當然,如果兩個MyObject具有相同id的實例被認為是相同的,你可以實現一個當且僅當id相同時equals返回的方法true,然后你的原始代碼就足夠了。



查看完整回答
反對 回復 2023-05-10
?
嗶嗶one

TA貢獻1854條經驗 獲得超8個贊

將 提取ids到 a Set,以便盡可能快地進行查找:

Set<String> inclusionsSet = list2.stream().map(a -> a.id()).collect(Collectors.toSet());

List<String> intersection = list1.stream().filter(a -> inclusionsSet.contains(a)).collect(Collectors.toList());



查看完整回答
反對 回復 2023-05-10
  • 4 回答
  • 0 關注
  • 202 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號