我有类TestObject有两个变量:int A和int B. 我有一个TestObjects列表,我想从列表中删除重复项(包含相同A和相同B变量的对象。)
- 对象1(A = 1,B = 1)
- 对象2(A = 2,B = 2)
- 对象3(A = 1,B = 1)
在这种情况下,我想从列表中删除对象1或3,哪个无关紧要。
对象是不同的实例,所以标准:
LinkedHashSet<TestObject> hs = new LinkedHashSet<TestObject>();
hs.addAll(TestObjectList);
new.clear();
new.addAll(hs);
这不起作用。 有没有简单的方法来实现我的目标? 我尝试在迭代器中使用迭代器:
ListIterator<TestObject> iter = TestObjectList.listIterator();
while(iter.hasNext()){
TestObject to = iter.next();
ListIterator<TestObject> iter2 = TestObjectList.listIterator();
while(iter2.hasNext()){
TestObject to2 = iter2.next();
if(to.A==to2.A && to.B == to2.B){
iter.remove();
}
}
}
但我得到以下例外:
线程“main”java.util.ConcurrentModificationException'中的异常 “TestObject to2 = iter2.next();
不幸的是,我不知道以什么方式实现这一目标。 也许有一种更简单的方法?
答案 0 :(得分:3)
正如@DeludedPsyche所说,你只需要TestObject
支持正确的Java相等检查。然后,您可以向Set
添加实例,并重复“#忽略”。
有很多很好的链接可以让我们更多地了解这是如何/为什么有效的,例如: here和here。
Eclipse为我生成了这个:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + a;
result = prime * result + b;
return result;
}
@Override
public boolean equals( Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof TestObject)) {
return false;
}
TestObject other = (TestObject) obj;
if (a != other.a) {
return false;
}
if (b != other.b) {
return false;
}
return true;
}
答案 1 :(得分:1)
equals
课程中的hashcode
和TestObject
。TestObject
个对象放入Set
实施中。