在java arraylist中查找重复对象

时间:2011-03-31 17:13:49

标签: java object arraylist duplicates

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

我有一个对象的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是否有重复对象的最佳方法是什么。请让我知道

由于

哈里什

4 个答案:

答案 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

相关问题