Это мой код, чтобы построить возможный тур по городам в Locale l
(это не оптимально, это просто дать мой ИИ поиск в начале).не уверен в причине ConcurrentModificationException
Я получаю ConcurrentModificationException
, что, насколько мне известно, происходит, когда более одной части кода обращается к переменной/коллекции и пытается ее модифицировать. Вызывая этот код, чтобы получить несчастные:
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
я изменить его, как я добавляю элемент в, но как итератор не метод для добавления (только удаление) Я использую метод коллекции.
Итак, мои вопросы:
- Является ли мое добавление элемента, что вызывает проблему?
- Если это так, как я могу добавить его правильно, так что
modCount
верен, и я не получаюConcurrentModificationException
?
Полный метод ниже, с комментарием на линии, где ConcurrentModificationException
происходит:
public void construct() {
tour = new ArrayList();
ArrayList<City> lcl = new ArrayList(l.getCitys());
tour.add(lcl.remove(0));
tour.add(lcl.remove(1));
while (!this.tourComplete()) {
System.out.println(tour.size());
Iterator tourit = tour.iterator();
City g1 = (City) tourit.next();
City g2 = (City) tour.get(lcl.indexOf(g1)+1);
int gapDist = l.distanceBetweenCitys(g1, g2);
while (tourit.hasNext()) {
City C = null;
int best = Integer.MAX_VALUE;
for (Iterator lclit = lcl.iterator(); lclit.hasNext();) {
City c = (City) lclit.next();
int avg = (l.distanceBetweenCitys(g1,c) +
l.distanceBetweenCitys(g2, c))/2 ;
if ((avg<gapDist) && (avg<best)) {
C = c;
best = avg;
}
}
if (C != null) {
assert(best == Integer.MAX_VALUE);
City A = tour.get(0);
City Z = tour.get(tour.size()-1);
boolean begin = true;
for (Iterator lclit = lcl.iterator(); lclit.hasNext();) {
City c = (City) lclit.next();
int dist = l.distanceBetweenCitys(A,c);
if (dist<best) {
begin = true;
C = c;
best = dist;
}
}
for (Iterator lclit = lcl.iterator(); lclit.hasNext();) {
City c = (City) lclit.next();
int dist = l.distanceBetweenCitys(Z,c);
if (dist<best) {
begin = false;
C = c;
best = dist;
}
}
if (begin) {
// one of these is causing the problem
tour.add(0,C);
}
else {
// one of these is causing the problem
tour.add(C);
}
}
else {
// one of these is causing the problem
tour.add(tour.indexOf(g2),C);
}
g1 = (City) tourit.next(); // this is where it all goes wrong
g2 = (City) tour.get(lcl.indexOf(g1)+1);
gapDist = l.distanceBetweenCitys(g1, g2);
}
}
}
Я подумал о 1 и 2, как только увидел исключение Мое, что мой код делает грубо, заключается в том, чтобы вставить лучший город между каждой парой городов, пока все города не окажутся в туре, поэтому ему нужно перебраться через себя после каждого города добавляется по мере создания новых пар Казалось бы, что 3 идентификатора мой лучший вариант, Иль теперь спустится к исправлению. Пока SO возвращался ко мне, я подумал о возможном числе 5, которое должно было бы взять содержимое основного цикла while и превратить его в метод, и решить это рекурсивно, не используя итератор, и, надеюсь, избегаем исключения спасибо за помощь^_^ – Gwilym
+1. Первое предложение является важным ... – Jared