2012-01-02 8 views
0

ここでどこが間違っているのか誰にでも教えてもらえますか?リストの同時変更例外

File promoCountFile = new File(RaconTours.PATH + "promocodeCount.txt"); 
      if (promoPlistPath.exists()) { 
       try { 
        ObjectInputStream inStream = new ObjectInputStream(new FileInputStream(promoPlistPath)); 
        ObjectInputStream promoStream = new ObjectInputStream(new FileInputStream(promoCountFile)); 
        promoobj = (ArrayList<HashMap<String, Object>>) promoStream.readObject(); 
        obj = (ArrayList<HashMap<String, Object>>) inStream.readObject(); 
        for (HashMap<String, Object> tmpObj : obj) { 
         promoTourname = (String) tmpObj.get("promoTour"); 
         promocodeID = (String) tmpObj.get("promocode"); 
         if (promoTourname.equals(currentTour.getObjtourName())) { 
          //if the condition is met, remove the entry from the file 
          for (HashMap<String, Object> promoTemp : promoobj) { 
           promoTourCount = (Integer) promoTemp.get("promocodeTourCount"); 
          } 

          obj.remove(tmpObj); 
          --promoTourCount; 

          ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(promoPlistPath)); 
          out.writeObject(obj); 
          out.close(); 

          ObjectOutputStream promoout = new ObjectOutputStream(new FileOutputStream(promoCountFile)); 
          HashMap<String, Object> promoCountDict = new HashMap<String, Object>(); 
          promoobj.remove(0); 
          promoCountDict.put("promocodeTourCount",promoTourCount); 
          promoobj.add(promoCountDict); 
          promoout.writeObject(promoobj); 
          promoout.close(); 


         } 
        } 


        if (obj.size() == 0 || promoTourCount == 0) { 
         promoPlistPath.delete(); 
         promoCountFile.delete(); 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

      } 

ここでは、forループが2回目以降に繰り返し実行されている間に同時に変更例外が発生しています。

私はループの繰り返しとして毎回ファイル内のpromoTourCountの値を更新しようとしています。しかし、私はそれをやり遂げていません。私は位置0に存在する物体を削除し、その位置に新しいものを追加していた複数のオブジェクトを追加することを回避するので(promoobj.remove(0);

Plzを私にあなたが変更している

+0

私の質問の答えはありません? – tejas

答えて

2

を助けますあなたが反復しているコレクション。これによりエラーが発生します。

for (HashMap<String, Object> tmpObj : obj) { 

をしかし、ここで、それから削除します:あなたがオーバーOBJここ反復

obj.remove(tmpObj); 

を私はあなたのために終了した場合にのみ別のコレクションに削除して、マップからそれらを削除するには、あなたがアイテムを保存することをお勧めしますループ。

編集:< < コード例を追加する>>

List<Integer> toRemove = new LinkedList<Integer>(); 
for (int i = 0; i < obj.size(); i++) { 
    HashMap<String, Object> tmpObj = obj.get(i); 

    if (/* something */) { 
     /* ... */ 
     /* obj.remove(tmpObj); replaced with*/ 
     toRemove.add(0, i); // notice that I add bigger indices first 
    } 
} 
// Here we make the removal from bigger indices to smaller ones 
// Notice that we iterate and remove from different collections. 
for (Integer indexToDelete : toRemove) { 
    obj.remove(indexToDelete); 
} 

あなたは要素を削除したいとき、これは基本的な考え方です。ただし、objを変更したものをすぐにforループで出力する必要があります。その後、おそらくインデックスのハックのビットは、あなたのためのより良い仕事をします:

for (int i = 0; i < obj.size(); i++) { 
    HashMap<String, Object> tmpObj = obj.get(i); 

    if (/* something */) { 
     /* ... */ 
     /* obj.remove(tmpObj); replaced with*/ 
     obj.remove(i); // We erase the element but this time we do not use enhanced for loop which is ok. 
     i--; // we decrease the index because th enumber of elements decreased. Index hack. Ugly. 
     System.out.println(obj); // modified obj :) 
    } 
} 
+0

私はそれをはっきりと知りません、今リストを学んでいます。あなたが気にしないなら、私は次の時間この問題を抱えているようにそれを行う方法を私に見せてもらえますか?しかし、2nd forループの問題ではありませんか? – tejas

+0

もし私が間違っていないなら、あなたはエラー自体を共有していません。それでも私はループの2番目のループは良いと思う、それはちょうど値をクエリ...私はいくつかのexplaryコードを含む私の答えを編集します。 –

+0

さて、このエラーはただの並行変更例外です。他に何もない。私は2番目のforループもこの場合に問題があるはずだと思う。私も値を更新しているので、promoobj.remove(0);このシナリオは次のようになります。最初はpromocodeTourの値が2であり、ループは1に減り、その最初のforループの後に条件があるかどうかを調べます。今では1回の反復になると0になり、今の場合は例外をキャッチしています – tejas

関連する問題