2012-03-11 4 views
-1

私はforeachループを持っており、ベクトルの各オブジェクトを反復しています。私はコードをデバッグすると、ベクトルの最初のオブジェクトに対して正常に実行されます。しかし、それは2番目のオブジェクトのループを実行しようとすると失敗します。私はですベクトルには複数の要素があります。この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

+0

これはおそらくあなたの問題です:http://stackoverflow.com/questions/7080208/java-exception-when-remove-a-record-inside-a-list-in-a-for-each-loop – assylias

+0

定義を表示してくださいあなたのvecForShapesの。 – PearsonArtPhoto

答えて

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

データが指数関数的に増加し、スレッドセーフである場合、Vectorが優れています。しかし、他のほとんどのケースではArrayListも使用します – ziq

+0

ありがとうございました...あなたが正しいことをありがとう....私は、コレクションを削除したり、コレクションを反復するときに追加できなかったかどうかはわかりませんでした... 私は今見てみましょうarraylistで...チップのおかげで! –

1

「)(iterator.removeを」Iterableforeachを使用する場合は、舞台裏でIteratorがあるだろうし、それを反復処理するときには、コレクションを変更することはできませんが、あなたは呼び出すことができます。ですから古い反復モデルfor (Iterator i = v.iterator(); i.hasNext(); .....を使用し、i.remove()と呼ぶことをお勧めします。

関連する問題