根据arraylist元素之间的特定比较,删除自定义对象类型的arraylist的内容

时间:2014-01-04 12:32:27

标签: java arraylist

我有一个类型为RemoveTest的ArrayList,其中RemoveTest是用户定义的类。 RemoveTest有两个String类型mId和rmId属性。 我需要在ArrayList中找到满足以下条件的元素(类型为RemoveTest的对象):这样obj1.rmId()的值与obj2.getmId()相同,然后删除这两个元素(obj1和obj2)

我通过编写以下代码尝试了这个:

import java.util.ArrayList;
import java.util.Iterator;

public class RemoveItr {

    public static void main(String[] args){
        ArrayList<RemoveTest> eleList = new ArrayList<RemoveTest>();
        RemoveTest obj1 = new RemoveTest();
        obj1.setmId("m1");
        obj1.setRmId("");
        RemoveTest obj2 = new RemoveTest();
        obj2.setmId("m2");
        obj2.setRmId("m1");
        RemoveTest obj3 = new RemoveTest();
        obj3.setmId("m3");
        obj3.setRmId("");
        RemoveTest obj4 = new RemoveTest();
        obj4.setmId("m4");
        obj4.setRmId("m3");
        RemoveTest obj5 = new RemoveTest();
        obj5.setmId("m5");
        obj5.setRmId("");
        eleList.add(obj1);
        eleList.add(obj2);
        eleList.add(obj3);
        eleList.add(obj4);
        eleList.add(obj5);
        Iterator<RemoveTest> i = eleList.iterator();
        while(i.hasNext()){
            RemoveTest fwdM =(RemoveTest)i.next();
            String fwdId = fwdM.getmId();
            Iterator<RemoveTest> ni = eleList.iterator();

            while(ni.hasNext()){
                RemoveTest revM =(RemoveTest)ni.next();
                String revId = revM.getRmId();
                if(fwdId.equals(revId)){
                    System.out.println("fwdId "+fwdId+"- revId "+revId);
                     i.remove();
                     ni.remove();

                }

            }
        }
    }
}

public class RemoveTest {

    String mId;
    String rmId;

    public String getmId() {
        return mId;
    }
    public void setmId(String mId) {
        this.mId = mId;
    }
    public String getRmId() {
        return rmId;
    }
    public void setRmId(String rmId) {
        this.rmId = rmId;
    }

    }

注意:这两个类都是公共的,因为它们不在同一个源文件中。

但是,我得到了ConcurrentModificationException并且我认为这是因为,因为我已经在遍历arraylist的中间,然后其他循环(迭代器)介入并尝试在同一个ArrayList上操作。

这种理解是否正确?如果是这样,我该如何解决这个问题并实现解决方案。

2 个答案:

答案 0 :(得分:2)

除了使用Iterator.remove()

之外,您无法在迭代时修改集合

此规则意味着您不能同时使用两个迭代器并期望remove()起作用,因为在一个迭代器上调用remove()将违反其他迭代器。

解决方案是在单独的Set中收集需要删除的所有条目,然后在逻辑完成后,致电List.removeAll(set)

鉴于此,您根本不需要迭代器 - 只需使用foreach语法:

一个简单的例子:

List<RemoveTest> list = new ArrayList<RemoveTest>();
// populate list
Set<RemoveTest> removals = new HashSet<RemoveTest>();
for (RemoveTest i : list)
    for (RemoveTest j : list)
        if (...)
            removals.add(i); // j will get added in another iteration
list.removeAll(removals);

答案 1 :(得分:-1)

使用CopyOnWriteArrayList而不是ArrayList,它应该可以解决您的问题。