[英]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);
}
如果listA
和listB
中的對象的所有項目都具有相同的字段,則一切正常。
問題在於某些項目僅具有id
和username
而另一些項目也可以具有fullName
或age
,因此該方法不再起作用。 我想保持相同的邏輯,只考慮id
字段,因為它存在於所有對象中。
一種明顯的方法是僅復制其他List<String>
對象的id
字段,並使用獲取的列表來檢測元素,然后僅通過id
從兩個列表中搜索obj。 由於多次迭代,該方法具有很大的復雜性。 有沒有一個簡短的方法來實現這一目標?
您必須實現equals
和hashCode
才能使用集合。 集合需要一種方法來識別一個對象是否等於另一個對象,並且默認行為在這里不起作用。
順便說一句,我建議在列表上使用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具有用於自動生成equals
和hashCode
,您可以在其中選擇必要的屬性。
如@ 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.