@gibsonen

ConcurrentModificationException, Хешмап и Лист?

Здравствуйте кидает Exception ConcurrentModificationException на этой строчке for (Transaction t : c.getTransactions())(64 строчка) на 2 итерации. Саму суть ошибки понимаю - случается она тогда, когда в цикле происходит удаление элементов итератора. Пытался remove изменить на removeIF, но ошибка та же.

private static void iteration() {
        Integer n = 1;
        Integer k = 1;
        Double maxProfit;
        Integer clusterInd;
        while (k > 0) {
            System.out.println("Итерация " + n);
            n++;
            k = 0;
            for (int i=0;i<clusters.size();i++) {
                Cluster c = clusters.get(i);
                for (Transaction t : c.getTransactions()) {//ошибку кидает здесь на 2 итерации
                    maxProfit = profit();
                    clusterInd = -1;
                    c.deleteTransaction(t);
                    int j = 0;
                    for (Cluster cl : clusters) {
                        if (j != i) {
                            cl.addTransaction(t);
                            Double p = profit();
                            if (p > maxProfit) {
                                maxProfit = p;
                                clusterInd = j;
                            }
                            cl.deleteTransaction(t);
                        }
                        j++;
                    }
                    if (clusterInd == -1){
                        clusters.get(i).addTransaction(t);
                    }else {
                        k++;
                        clusters.get(clusterInd).addTransaction(t);
                    }
                }
            }
        }
        System.out.println(k);
    }

Функция, в которой происходит удаление транзакции:

public void deleteTransaction(Transaction m) {
        if (this.count > 0) {
            String[] trans = m.getTrans();
            for (String s : trans) {
                this.square--;
                if (freq.containsKey(s)) {
                    if (freq.get(s) > 0) {
                        this.freq.put(s, freq.get(s) - 1);
                        if (this.freq.get(s) == 0) {
                            this.width--;
                            freq.entrySet().removeIf(entry -> entry.getKey().equals(s));
                        }
                    }
                }
            }
            this.count--;
            if (this.count > 0) {
                this.height = (double) this.square / this.width;
            } else {
                this.height = 0.0;
            }
            transactions.removeIf(m::equals);
        }
    }

Логи:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:939)
    at java.base/java.util.ArrayList$Itr.next(ArrayList.java:893)
    at com.lab6.ClopeAlgorithm.iteration(ClopeAlgorithm.java:64)
    at com.lab6.ClopeAlgorithm.main(ClopeAlgorithm.java:96)
  • Вопрос задан
  • 180 просмотров
Решения вопроса 1
zolt85
@zolt85
Программист
Попробуйте скопировать коллекцию c.getTransactions()
for (int i=0;i<clusters.size();i++) {
    Cluster c = clusters.get(i);
    List<Transaction> transactions = new ArrayList<>(c.getTransactions());
    for (Transaction t : transactions) {
        ...
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽