从列表中删除与其他对象重复的对象(具有相同的变量)

时间:2016-02-10 13:15:59

标签: java list

我有类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();

不幸的是,我不知道以什么方式实现这一目标。 也许有一种更简单的方法?

2 个答案:

答案 0 :(得分:3)

正如@DeludedPsyche所说,你只需要TestObject支持正确的Java相等检查。然后,您可以向Set添加实例,并重复“#忽略”。

有很多很好的链接可以让我们更多地了解这是如何/为什么有效的,例如: herehere

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)

  1. 使用您的成员(即A和B)覆盖equals课程中的hashcodeTestObject
  2. 将所有TestObject个对象放入Set实施中。