簡體   English   中英

Java中2個對象列表之間的區別

[英]Difference between 2 lists of objects in Java

我有一個obj類型MyObj ,如下所示:

  class MyObj{
    String id;
    String username;
    String fullName;
    String age;

    //getters & setters
}

假設我們有2個包含不同數量元素的列表,如下所示:

List<MyObj> listA
List<MyObj> listB

我有一個通用的方法來檢測listA中缺少的listB

 public static <T> List<T> getListDifference(List<T> list1, List<T> list2) {
        Collection<T> first = new HashSet<T>(list1);
        Collection<T> second = new HashSet<T>(list2);
        first.removeAll(second);
        return new ArrayList<T>(first);
    }

如果listAlistB中的對象的所有項目都具有相同的字段,則一切正常。

問題在於某些項目僅具有idusername而另一些項目也可以具有fullNameage ,因此該方法不再起作用。 我想保持相同的邏輯,只考慮id字段,因為它存在於所有對象中。

一種明顯的方法是僅復制其他List<String>對象的id字段,並使用獲取的列表來檢測元素,然后僅通過id從兩個列表中搜索obj。 由於多次迭代,該方法具有很大的復雜性。 有沒有一個簡短的方法來實現這一目標?

您必須實現equalshashCode才能使用集合。 集合需要一種方法來識別一個對象是否等於另一個對象,並且默認行為在這里不起作用。

順便說一句,我建議在列表上使用retainAll方法, 檢查一下。

覆蓋MyObjs equals方法:

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    MyObj myObj = (MyObj) o;

    return (id != null ? !id.equals(myObj.id) : myObj.id != null);
}

IntelliJ / Android Studio具有用於自動生成equalshashCode ,您可以在其中選擇必要的屬性。

如@ Kevin Esche所述,您必須在MyObj POJO中實現equals()hashCode() ,根據您的情況,它們應為:

   @Override
public int hashCode() {
    return Objects.hash(id);
}

@Override
public boolean equals(Object obj) {
    if (obj == this) return true;
    if (!(obj instanceof MyObj)) return false;

    MyObj myObj= (MyObj) obj;
    return Objects.equals(id, myObj.id);
}

即使年齡不同且ID相同,這也將起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM