首先,我想说我已经找到了答案,但没有得到合适的解决方案。所以我决定在这里发布。
我有一个对象的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是否有重复对象的最佳方法是什么。请让我知道
由于
哈里什
答案 0 :(得分:3)
如果您想知道重复项是什么,可以使用自定义TreeSet<Provider>
或TreeMap创建Comparator<Provider>
。
答案 1 :(得分: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;
}
}
答案 2 :(得分:1)
您是否尝试过apache commons CompareToBuilder?它使用反射来比较对象,甚至可以处理私有成员。我相信它可以做一个深入的比较,所以它应该能够遵循你的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<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.
答案 3 :(得分:0)
这里有一个链接如何使用JAXB调整equals和hashCode方法:
http://confluence.highsource.org/display/J2B/JAXB2+Basics+Plugins