检测ArrayList是否包含同一对象的多个实例

时间:2015-09-02 06:53:23

标签: java arraylist

我试图检测ArrayList是否包含对象的相同coppies但没有成功。这是我的代码;

public class Foo{
    int id;
    int name;

    @Override
    public boolean equals(Object o){
        Foo f = (Foo)o;
        return f.id==this.id;
    }

}

//in another class
ArrayList<Foo> foos;
...
boolean ifFoosListContainsMultipleFoo(Foo f){
    return foos.indexOf(f)!=foos.lastIndexOf(f);
}
//but this method always returns `false` even the `foos` list
//contains multiple object with the same `id`;

那么,我做错了什么,是否有更优化的方法呢?

提前致谢。

编辑:我看到我需要覆盖hash类的Foo方法,然后为什么equals功能不够;

编辑2:抱歉浪费你的时间,但这是我的错误。我的代码没有问题,我使用了ifFoosListContainsMultipleFoo!ifFoosListContainsMultipleFoo,所以这是false响应的结果。

道歉我。

2 个答案:

答案 0 :(得分:3)

您的代码应该按原样运行,但在列表中f 的情况下除外...

所以你可以做点什么,

boolean ifFoosListContainsMultipleFoo(Foo f){
    return (foos.indexOf(f) != -1) && (foos.indexOf(f)!=foos.lastIndexOf(f));
}

答案 1 :(得分:1)

您可以使用HashSet<Foo>执行此操作。您也应该覆盖hashCode因为HashSet在内部使用哈希值。

Set<Foo> set = new HashSet<Foo>(foos);
// check for duplicates
set.size() == foos.size();

您也可以手动使用该设置,这样可以保留重复项,并且可以让您更快地结束检查(而不是添加所有内容):

Set<Foo> set = new HashSet<Foo>();
// check for duplicates
for (Foo foo : foos){
    if (!set.contains(foo)){
        set.add(foo);
    } else {
        // do something with foo, which is a duplicate.
        // possibly end check for duplicates or store in a list
    }
}