簡體   English   中英

如何在 ArrayList 中查找重復項<object> ?<div id="text_translate"><p> 這是一個很常見的問題,但我找不到這部分:</p><p> 假設我有這個數組列表:</p><pre> List&lt;MyDataClass&gt; arrayList = new List&lt;MyDataClass&gt;; MyDataClass{ String name; String age; }</pre><p> 現在,我需要根據MyDataClass中的age查找重復項並將其刪除。 如何使用<a href="http://www.javadb.com/remove-duplicate-items-from-an-arraylist" rel="nofollow">此處</a>描述的 HashSet 之類的東西?</p><p> 我想,我們需要覆蓋 MyDataClass 中的equals嗎?</p><ol><li> 但是,如果我沒有這樣做的奢侈呢?</li><li> 而HashSet實際上是如何在內部找到並且不添加重復項的? 我<a href="http://www.google.com/codesearch#TTY8xLpnKOE/src/share/classes/java/util/HashSet.java&amp;q=HashSet&amp;type=cs&amp;l=103" rel="nofollow">在 OpenJDK 中</a>看到了它的實現,但無法理解。</li></ol></div></object>

[英]How to find duplicates in an ArrayList<Object>?

這是一個很常見的問題,但我找不到這部分:

假設我有這個數組列表:

List<MyDataClass> arrayList = new List<MyDataClass>;

MyDataClass{
   String name;
   String age;
}

現在,我需要根據MyDataClass中的age查找重復項並將其刪除。 如何使用此處描述的 HashSet 之類的東西?

我想,我們需要覆蓋 MyDataClass 中的equals嗎?

  1. 但是,如果我沒有這樣做的奢侈呢?
  2. 而HashSet實際上是如何在內部找到並且不添加重復項的? 在 OpenJDK 中看到了它的實現,但無法理解。

我建議您同時覆蓋equalshashCodeHashSet依賴於兩者!)

要刪除重復項,您只需使用 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。

請看這篇解釋equals()hashCodeHashSets的重要性的文章

另外,請參閱這個先前回答的問題

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.

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