我有一个类型为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上操作。
这种理解是否正确?如果是这样,我该如何解决这个问题并实现解决方案。
答案 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,它应该可以解决您的问题。