在java arraylist中查找重复对象

首先,我想说我已经找到了答案,但没有得到合适的解决方案。 所以我决定在这里发布。

我有一个对象的ArrayList(ArrayList(Provider))。 提供者对象具有名字,姓氏,NPI号码,列表(我没有列出所有字段)。

Provider { private long providerId; private String npiNumber; private PersonName providerName; private List
providerAddresses; }

现在我想找出ArrayList是否有基于这些属性(名字,姓氏,NPI,地址)的重复项。 每个提供商将有2个地址。 我们遇到的问题是提供者对象是从XSD生成的,无法修改。 所以我不能覆盖equals和hashcode方法。 所以Hashset(列表)不起作用。

那么检查ArrayList是否有重复对象的最佳方法是什么。 请告诉我

谢谢

哈里什

如果要了解重复项,可以使用自定义Comparator或TreeMap创建TreeSet

您可以通过包装地址来使用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; } } 

你有没有尝试过apache commons CompareToBuilder? 它使用reflection来比较对象,甚至可以处理私有成员。 我相信它可以做一个深入的比较,所以它应该能够跟随你的List元素并进行比较。 但是,如果它不能你可能不得不比较他们seperatley。

无论如何,您应该能够使用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
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.

这里有一个链接如何使用JAXB调整equals和hashCode方法:

http://confluence.highsource.org/display/J2B/JAXB2+Basics+Plugins