有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在java arraylist中查找重复对象

首先,我想说,我一直在寻找答案,但没有找到合适的解决方案。所以我决定把它贴在这里

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

Provider {

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

        }

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

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

谢谢

哈里什


共 (2) 个答案

  1. # 1 楼答案

    如果想知道重复项是什么,可以使用自定义的Comparator<Provider>或树形图创建TreeSet<Provider>

  2. # 2 楼答案

    你试过apache commons CompareToBuilder吗?它使用反射来比较对象,甚至可以处理私有成员。我相信它可以做一个深入的比较,所以它应该能够遵循您的列表元素并进行比较。然而,如果不能,你可能不得不分别比较它们

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