在Arraylist中重复,比较各种字段java

时间:2010-02-08 03:16:54

标签: java arraylist

我有一个代码来返回一个带有ArrayList重复项的arrayList 但似乎它不起作用,我正在比较阵列中的所有项目......

public ArrayList<ObjectList> duplicates(ArrayList<ObjectList> someObjectsList) {

    ArrayList<ObjectList> ret = new ArrayList<ObjectList>();
    for ( ObjectList aSomeObjectsList: someObjectsList) {

        String field1 = aSomeObjectsList.get1();
        String field2 = aSomeObjectsList.get2();
        String field3 = aSomeObjectsList.get3();
        String field4 = aSomeObjectsList.get4();
        for (ObjectList someObject : ret) {
            if (
                field1.trim().equals(someObject.get1())&& 
                field2.trim().equals(someObject.get2())&&
                field3.trim().equals(someObject.get3())&&
                field4.trim().equals(someObject.get4())     
                ){
                ret.add(aSomeObjectsList);

            }
        }

    }
    return ret;
} 

但我想我做错了什么因为它没有返回任何东西,我知道它在这4个字段标准下有重复

提前致谢

3 个答案:

答案 0 :(得分:3)

    for (Object someObject : ret) {
        if (
            field1.trim().equals(someObject.get1())&& 
            field2.trim().equals(someObject.get2())&&
            field3.trim().equals(someObject.get3())&&
            field4.trim().equals(someObject.get4())     
            ){
            ret.add(aSomeObjectsList);

        }
    }

上面的循环不起作用,因为它的大小为零。

你走了,

public Set<ObjectList> duplicates(ArrayList<ObjectList> someObjectsList) {

    Set<ObjectList> originals = new HashSet<ObjectList>();
    Set<ObjectList> duplicates = new HashSet<ObjectList>();

    for ( ObjectList aSomeObjectsList: someObjectsList) {
        boolean added = originals.add(aSomeObjectsList);
        if(!added){
            duplicates.add(aSomeObjectsList);
        }     
    }
    return duplicates;
} 

如果您的ObjectList班级具有hashCode()equals()方法的正确实施,这将有效。

免责声明:此实现不会提供有关在提供的列表中复制特定对象的次数的信息。它只会告诉您特定对象是重复的。我认为这是你的真实意图。如果您想要计算,多少次,您必须相应地修改代码。

提示/建议:您应该覆盖equals()方法并将字段相等性检查放在那里,一劳永逸。

答案 1 :(得分:2)

这不应该编译 - 如果aSomeObjectsListObject,则它没有方法get1()get2()等。

您的逻辑不起作用,因为您没有检查输入List中的每个元素与输入List中的其他元素;相反,您正在尝试检查返回List

此外,这不是检查集合中重复项的真正有效方法。更好的方法是使用HashMap,您可以在大致恒定的时间内检查集合成员资格。如果必须使用List,则先对其进行排序(假设您的对象具有自然顺序)并检查相邻成员是否相等。

除了这两个,只需使用List.contains()

答案 2 :(得分:1)

这是一种可以做到这一点的方法。我已经定义了一个基本类ObjectList,它显示了实现equalshashCode的方法。请注意,这假设所有内部变量都是非空的。如果这些变量可以包含null,那么在计算equals / hashCode时需要检查它。此外,此类中的对象还必须自己正确实现equals / hashCode。

public class ObjectList {

    private int h;

    private Object obj1;
    private Object obj2;
    private Object obj3;
    private Object obj4;

    @Override
    public boolean equals(final Object o) {
        if (!(o instanceof ObjectList))
            return false;

        final ObjectList that = (ObjectList) o;
        return that.obj1.equals(obj1) && that.obj2.equals(obj2)
            && that.obj3.equals(obj3) && that.obj4.equals(obj4);
    }

    @Override
    public int hashCode() {
        // caches the hashcode since it could be costly to recompute every time
        // but this assumes that your object is essentially immutable 
        // (which it should be if you are using equals/hashCode. If this is not
        // true and you want to just temporarily use this when doing the duplicate
        // test, move the h variable definition from the object level to this method
        // and remove this if statement.
        if (h != 0)
            return h;

        h = obj1.hashCode();
        h = h * 31 + obj2.hashCode();
        h = h * 31 + obj3.hashCode();
        h = h * 31 + obj4.hashCode();
        return h;
    }

}

public Collection<ObjectList> duplicates(
        final Collection<ObjectList> someObjectsList) {

    final Set<ObjectList> unique = new HashSet<ObjectList>(someObjectsList);
    final ArrayList<ObjectList> ret = new ArrayList<ObjectList>(someObjectsList);
    for (final ObjectList o : unique) {
        ret.remove(o);
    }

    // The ret list now contains the duplicate instances; instances 
    // with more than two occurrences will occur multiple times still in
    // this list.
    return ret;

    // If you want a list of unique duplicate instances then, comment out the above
    // return and uncomment this one.
    // return new HashSet<ObjectList>(ret);
}

对于参数和返回值,使用Collection<ObjectList>更好,如果可以这样做,那么你可以改变实现(ArrayList,Set等)。