[英]How to find duplicates in an ArrayList<Object>?
這是一個很常見的問題,但我找不到這部分:
假設我有這個數組列表:
List<MyDataClass> arrayList = new List<MyDataClass>;
MyDataClass{
String name;
String age;
}
現在,我需要根據MyDataClass
中的age
查找重復項並將其刪除。 如何使用此處描述的 HashSet 之類的東西?
我想,我們需要覆蓋 MyDataClass 中的equals
嗎?
我建議您同時覆蓋equals
和hashCode
( HashSet
依賴於兩者!)
要刪除重復項,您只需使用 ArrayList 作為參數創建一個新的HashSet
,然后清除 ArrayList 並放回存儲在HashSet
中的元素。
class MyDataClass {
String name;
String age;
@Override
public int hashCode() {
return name.hashCode() ^ age.hashCode();
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof MyDataClass))
return false;
MyDataClass mdc = (MyDataClass) obj;
return mdc.name.equals(name) && mdc.age.equals(age);
}
}
然后做
List<MyDataClass> arrayList = new ArrayList<MyDataClass>();
Set<MyDataClass> uniqueElements = new HashSet<MyDataClass>(arrayList);
arrayList.clear();
arrayList.addAll(uniqueElements);
但是,如果我沒有這樣做的奢侈呢?
然后我建議你做一些提供這些方法的裝飾器類。
class MyDataClassDecorator {
MyDataClass mdc;
public MyDataClassDecorator(MyDataClass mdc) {
this.mdc = mdc;
}
@Override
public int hashCode() {
return mdc.name.hashCode() ^ mdc.age.hashCode();
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof MyDataClassDecorator))
return false;
MyDataClassDecorator mdcd = (MyDataClassDecorator) obj;
return mdcd.mdc.name.equals(mdc.name) && mdcd.mdc.age.equals(mdc.age);
}
}
如果您無法覆蓋“MyDataClass”的 hashCode 和 equals 方法,您可以編寫一個處理此問題的包裝器 class。
public Set<Object> findDuplicates(List<Object> list) {
Set<Object> items = new HashSet<Object>();
Set<Object> duplicates = new HashSet<Object>();
for (Object item : list) {
if (items.contains(item)) {
duplicates.add(item);
} else {
items.add(item);
}
}
return duplicates;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.