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

标签 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;
    }

    }

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

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

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

最佳答案

在迭代集合时无法修改集合,除非使用 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);

关于java - 根据 arraylist 元素之间的特定比较删除自定义对象类型的 arraylist 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20921024/

相关文章:

java - 我如何将这个 forEach 转换为 for 循环

java - 未找到 JDBC/ODBC 数据源名称且未指定默认驱动程序

java - 我想将文件的内容按行分割成数组列表,并在正确的标识符下重建它们

安卓工作室 : How to add an item from listview1 to listview2 onClick

java - 如何从服务器日志中删除警告: [WARN] No configuration found for the specified action: '/' in namespace: ''

java - 如何模拟 DriverManager.getConnection(...)?

java - Selenium 中切换窗口

C# 有理由不再使用 ArrayList 而不是 List<T> 吗?

java - ArrayList toString() 方法

java - 根据预订时长获取最受欢迎的酒店房间