Исключение одновременной модификации для списка - PullRequest
0 голосов
/ 02 января 2012

Кто-нибудь может сказать мне, где я иду не так?

  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 повторяется во второй раз или после этого.

Я пытаюсь обновлять значение promoTourCount в файле каждый раз, когда цикл повторяется. Но я не могу этого сделать. Потому что, чтобы избежать сложения нескольких объектов, я удаляю объект, присутствующий в позиции 0, и добавляю новый в эту позицию ( promoobj.remove (0); )

Пожалуйста, помогите мне

1 Ответ

2 голосов
/ 02 января 2012

Вы изменяете коллекцию, для которой вы выполняете итерацию. Это вызовет ошибку. Вы перебираете obj здесь:

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

Но удалите его здесь:

obj.remove(tmpObj);

Я рекомендую хранить элементы, которые нужно удалить, в другой коллекции и удалять их с карты только после завершения цикла for.

Редактировать : << <em>Добавление примера кода >>

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 :)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...