2012-03-11 79 views
-1

我有一个foreach循环遍历矢量中的每个对象。当我调试代码时,它成功运行矢量中的第一个对象。但是当它尝试运行第二个对象的循环时,它会失败。我是当然向量中有多个元素。这个foreach循环有什么问题.. ??? Android

for(Object shape : vecForShapes) 
     { 
      currentNode = (Drawable) shape; 
      newNode = getResources().getDrawable(R.drawable.nodered); 
      newNode.setBounds(currentNode.getBounds()); 
      vecForShapes.remove(currentNode); 
       vecForShapes.add(newNode); 
     } 

所以基本上我的问题是,为什么这个循环失败?我真的不明白这里有什么问题。

P.S.我的最终目标是从矢量中删除currentNode,将其替换为newNode,然后在我的onDraw方法中重新绘制整个矢量。

感谢

+1

你是什么意思:它失败了?你有异常吗? – assylias 2012-03-11 20:26:09

+0

这很可能是你的问题:http://stackoverflow.com/questions/7080208/java-exception-when-remove-a-record-inside-a-list-in-a-for-each-loop – assylias 2012-03-11 20:28:47

+0

请显示定义你的vecForShapes。 – PearsonArtPhoto 2012-03-11 20:29:05

回答

8

您不能删除或从/到你迭代对集合添加对象。 vecForShapes.remove(currentNode);例如修改vecForShapes。因此你会得到你的例外。

如果我是你,我会做你想要这样的修改:

for (int i = 0; i < vecForShapes.size(); i++) { 
    currentNode = (Drawable) shape; 
    newNode = getResources().getDrawable(R.drawable.nodered); 
    newNode.setBounds(currentNode.getBounds()); 
    vecForSahpes.set(i, newNode); 
} 

这应该做你想做的没有任何错误。

PS:你的意思是Vector?我认真推荐使用ArrayList。它的性能明显更好。

+0

当数据呈指数增长且线程安全时,向量更好。但是,大多数其他情况下,我也会使用ArrayList – ziq 2012-03-11 20:47:15

+0

非常感谢您的正确....我不知道我无法从迭代中删除或添加集合... 我现在肯定会看一看在arraylist ...感谢提示! – 2012-03-11 22:04:22

1

当在Iterable上使用foreach时,幕后会出现Iterator,并且在迭代迭代时无法修改Collection,但可以调用“iterator.remove()”。所以我建议你使用旧的迭代模型for (Iterator i = v.iterator(); i.hasNext(); .....并在其上调用i.remove()