2012-03-11 38 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()