【问题标题】:How I can add objects into an ArrayList when I'm using this ArrayList in a for loop?当我在 for 循环中使用此 ArrayList 时,如何将对象添加到 ArrayList 中?
【发布时间】:2014-12-24 09:54:34
【问题描述】:

我需要将一些对象添加到我在 for 循环中使用的 ArrayList。这是代码:

        List<Bulto> bultosHijos = bultoDAO.findChilds(idBulto);
        List<Bulto> bultosMasProfundos = new ArrayList();

        for (Bulto bulto : bultosHijos) {
            List<Bulto> bultosNietos = bultoDAO.findChilds(bulto.getIdBulto());

            if (!bultosNietos.isEmpty()) {
                bultosHijos.addAll(bultosHijos.size(), bultosNietos);
            } else {
                bultosMasProfundos.add(bulto);
            }
        }

这向我抛出了“当前修改异常”。我尝试更改返回我的 DAO 的类型,但我不能。我怎样才能避免这个错误并做到这一点?

非常感谢

编辑 1:

感谢您的所有回复!我现在正在使用 ListIterator 和下面的代码,效果很好! 但是如果我不使用listIterator.previous(),while 循环会立即退出,我不希望这样。好吗?

        List<Bulto> bultosHijos = bultoDAO.findChilds(idBulto);
        List<Bulto> bultosMasProfundos = new ArrayList();
        ListIterator<Bulto> listIterator = bultosHijos.listIterator();

        while (listIterator.hasNext()) {
            Bulto bulto = listIterator.next();
            List<Bulto> bultosNietos = bultoDAO.findChilds(bulto.getIdBulto());

            if (!bultosNietos.isEmpty()) {
                for (Bulto bultoNieto : bultosNietos) {
                    listIterator.add(bultoNieto);
                    listIterator.previous();
                }
            } else {
                bultosMasProfundos.add(bulto);
            }
        }

【问题讨论】:

标签: java spring hibernate loops arraylist


【解决方案1】:

使用ListIterator 在迭代arrayList 时同时添加或删除。当您尝试使用 forloop 从列表中添加或删除对象时,它肯定会抛出 Current Modification Exception。所以你不能修改列表。通过使用ListIterator,您可以从列表中add remove 对象。

这里是示例代码:

List<String> list1=new ArrayList<String>();
list1.add("a");
list1.add("b");
// c is missing in the list
list1.add("d");
list1.add("e");
ListIterator<String> it=list1.listIterator();
while(it.hasNext()){
    if(it.next().equals("b")){
        // add c in the list after b
        it.add("c");
    }
}
System.out.println(Arrays.toString(list1.toArray(new String[]{})));

输出:

[a, b, c, d, e]

【讨论】:

  • 我还添加了示例代码以使其更清晰。
【解决方案2】:

如果要对 ArrayList 进行任何修改,则在循环遍历它时,必须通过迭代器进行循环,因为常规的 for 循环对您没有帮助,请查看 here

Iterator<String> iter = myArrayList.iterator();

while (iter.hasNext()) {
    String str = iter.next();

    if (someCondition)
        iter.remove();
}

【讨论】:

    【解决方案3】:

    唯一允许您在循环访问 ArrayList 时添加它的方法是使用迭代器:

    ListIterator<String> iterator = bultosHijos.iterator();
    while (iterator.hasNext()) {
        String str = iterator.next();
        // now if we want to...
        iterator.add("some other string");
    }
    

    迭代器还有一个.remove() 和一个.set() 用于编辑元素。

    ListIterator 上没有.addAll(),所以如果要添加很多元素,则必须创建自己的循环并逐个添加:

    for (String s: bultosNietos)
        iterator.add(s);
    

    修改列表的任何其他方式都会给出ConcurrentModificationException

    【讨论】:

      【解决方案4】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-18
        • 1970-01-01
        • 1970-01-01
        • 2014-04-17
        • 1970-01-01
        • 1970-01-01
        • 2020-03-05
        • 1970-01-01
        相关资源
        最近更新 更多