我试图检测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
响应的结果。
道歉我。
答案 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
}
}