Ceci est mon code pour construire un tour possible de villes dans un Locale l
(ce n'est pas optimal c'est juste pour donner à ma recherche AI une longueur d'avance).pas sûr de raison pour ConcurrentModificationException
Je reçois un ConcurrentModificationException
qui, à ma connaissance, arrive lorsque plusieurs parties de code accèdent à une variable/collection et tentent de la modifier. Causer ce code pour obtenir malheureux:
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
je modifie comme je l'ajout d'un élément, mais comme le Iterator ne dispose pas d'une méthode pour ajouter (seulement la suppression) J'utilise la méthode de la collection.
Alors, mes questions sont les suivantes:
- est mon ajoutant l'élément ce qui cause le problème?
- Si c'est le cas, comment l'ajouter correctement pour que le
modCount
soit correct et que je n'obtienne pas leConcurrentModificationException
?
méthode complète ci-dessous, avec un commentaire sur la ligne où le ConcurrentModificationException
arrive:
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);
}
}
}
Je pensais à 1 et 2 dès que j'ai vu l'exception Mon code consiste à insérer la meilleure ville entre chaque paire de villes jusqu'à ce que toutes les villes soient dans le tour donc elle doit se remettre après chaque ville ajouté que de nouvelles paires sont formées Il semblerait que 3 ids ma meilleure option, Il se résout à la difficulté maintenant. Alors que SO revenait à moi, j'ai pensé à un nombre possible 5 qui serait de prendre le contenu de la boucle while principale et d'en faire une méthode, et de résoudre ceci de manière récursive sans utiliser l'itérateur, et espérer éviter l'exception merci pour toute l'aide^_^ – Gwilym
+1. La première phrase est la plus importante ... – Jared