2011-03-31 62 views
1

首先,我想說我已經搜索了一個答案,但沒有得到一個合適的解決方案。所以我決定在這裏發佈。在java arraylist中查找重複的對象

我有一個ArrayList的對象(ArrayList(Provider))。提供者對象具有名字,姓氏,NPI編號,列表(我沒有列出所有字段)。

Provider { 

     private long providerId; 
     private String npiNumber; 
     private PersonName providerName; 
     private List<Address> providerAddresses; 

     } 

現在我想找到,如果ArrayList中具有基於這些屬性(姓,名,NPI,地址)重複。每個提供商將有2個地址。我們遇到的問題是提供者對象是從XSD生成的,無法修改。所以我不能重寫equals和hashcode方法。所以Hashset(列表)不起作用。

那麼檢查ArrayList是否有重複對象的最好方法是什麼?請讓我知道

感謝

哈里什

回答

3

您可以用自定義Comparator<Provider>或者一個TreeMap創建TreeSet<Provider>,如果你想知道重複是什麼。

+5

一些示例代碼,請:) – Harry 2011-03-31 17:26:00

1

可以使用的HashSet(名單)通過包裹你的地址欺騙。

class AddressWrapper { 
    Address address; 
    public boolean equals(Object o) { 
     if(!(o instanceof AddressWrapper)) return false; 
     AddressWrapper aw = (AddressWrapper)o; 
     Address a = aw.address; 
     return a.street.equals(address.street) 
      && a.otherValues.equals(address.otherValues); // fill these in 

    } 
    public int hashCode() { 
     int hash = address.street.hashCode(); 
     hash = hash * 31 + address.otherValues; 
     // others 
     return hash; 

    } 

} 
+0

謝謝glowcoder。我創建了一個ProviderWrapper,並且能夠覆蓋equals方法,它對提供者對象中的Strings&int字段起作用。但問題是提供者有一個字段:列表

。我爲地址對象創建了一個AddressWrapper,但是如何在Provider下使用AddressWrapper而不是Address對象。希望你能理解我的問題 – Harry 2011-03-31 19:01:48

+0

在你的'ProviderWrapper.equals()'方法中,你可以從'List

'創建一個'List corsiKa 2011-03-31 19:42:14

1

您是否嘗試過apache commons CompareToBuilder?它使用反射來比較對象,甚至可以處理私人成員。我相信它可以做一個深入的比較,所以它應該能夠跟隨你的List元素並進行比較。但是,如果它不能,你可能不得不比較它們。

無論如何,你應該能夠使用TreeSet和自定義比較器的組合。 請注意,此代碼未經測試,可能不是最高性能的方式,但應使用最少的代碼完成工作。

 class DupeComparator implements Comparator{ 

      @Override 
      public int compare(Object o1, Object o2){ 

       // Might have to roll your own compare here if CompareToBuilder doesn't do 
       // a deep compare of your List<Address> Fields 
       return CompareToBuilder.reflectionCompare(o1, o2); 
      }   
     } 

     TreeSet set = new TreeSet(new DupeComparator()); 

     // this should give you a tree set without duplicates 
     set.addAll(providerList); 

     // If you need to know which elements are dupilicates you'd 
     // probably have to iterate your list   
     for(Provider p : providerList){ 
      if(!set.contains(p)) 
       set.add(p); 
      else 
       System.out.printn(p + " is a duplicate"); 
     } 


EDIT: Changed from EqualsBuilder to CompareToBuilder which makes more sense in this case.