【问题标题】:Modifying Java ArrayList while iterating over it在迭代 Java ArrayList 时对其进行修改
【发布时间】:2012-03-03 11:44:26
【问题描述】:

我想做类似的事情 this

但是,我不希望添加的元素被迭代。基本上我有一个底层的arraylist,我在arraylist上返回一个迭代器。在使用该迭代器进行迭代时,我想将元素添加到原始数组列表中。我该怎么做?

编辑:这个问题是我需要迭代器中的对象被迭代代码修改。我不认为克隆数组列表会起作用......

EDIT2:这是我的代码的精简版。

public class Map {
     // a bunch of code
     private ArrayList<Robot> robots;

     public Iterator<Robot> getRobots() {
          return robots.iterator();
     }

     public void buildNewRobot(params) {
          if(bunchOfConditions)
                robots.add(new Robot(otherParams);
     }

     // a bunch more code
}

这是另一个类中使用的地图。

for(Iterator<Robot> it = map.iterator(); it.hasNext();){
   Robot r = it.next();
   // a bunch of stuff here
   // some of this code modifies Robot r 

   if(condition)
       map.buildNewRobot(params);
}

【问题讨论】:

  • 提供相关代码会很有帮助
  • 添加了代码。抱歉省略了。

标签: java iterator


【解决方案1】:

它可能会帮助你。

ArraList<E> a = new ArrayList<E>();
Iteratore<E> i = a.iterator();
loop(check condition){
    if(satisfied){
         a.add(E e);
    }
}

【讨论】:

    【解决方案2】:

    您可以创建列表的副本并迭代副本并将数据添加到旧列表。问题是你不会迭代新的itens。

    【讨论】:

    • 更多的工作,但你可以保留一个从真到假的变量,当没有变化时,f.e. while(Changes) => 进行复制,将更改设置为 false,执行该过程,如果添加或更改某些内容,则将其更改为 true,否则该过程将结束,
    • 这可能是在迭代时处理数组列表成员的最干净和最安全的方法。我使用了这种技术并看到了一致性
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 2014-07-12
    • 2011-03-31
    • 1970-01-01
    相关资源
    最近更新 更多