我认为我的代码存在问题,但我无法找到原因。
当我使用chemin.next()时,它的工作正常。
但是当我new_chemin.addAll(chemin.next());
时,我有一个NoSuchElementException
public Zone cherche_chemin(List<List<Zone>> chemins, List<Zone> zones_exclues, Zone zone_arrivee) {
boolean new_way = false;
for (Iterator<List<Zone>> chemin = chemins.iterator(); chemin.hasNext();) {
List<Zone> zones = chemin.next().get(chemins.size() - 1).getVoisinsAccessible(zones_exclues);
for (Zone test_zone : zones) {
new_way = true;
if (test_zone == zone_arrivee) {
return chemin.next().get(1);
} else {
List<Zone> new_chemin = new ArrayList<>();
enw_chemin.addAll(chemin.next()); // THIS LINE
new_chemin.add(test_zone);
chemins.add(new_chemin);
zones_exclues.add(test_zone);
}
}
chemin.remove();
}
if (new_way) {
return cherche_chemin(chemins, zones_exclues, zone_arrivee);
} else {
return null;
}
}
答案 0 :(得分:1)
注意iterator.next()
立即转移到下一个元素。改成这样的
public Zone cherche_chemin(List<List<Zone>> chemins, List<Zone> zones_exclues, Zone zone_arrivee) { boolean new_way = false; for (Iterator<List<Zone>> chemin = chemins.iterator(); chemin.hasNext();) { List<Zone> cheminList = chemin.next(); List<Zone> zones = cheminList .get(chemins.size() - 1).getVoisinsAccessible(zones_exclues); for (Zone test_zone : zones) { new_way = true; if (test_zone == zone_arrivee) { return cheminList.get(1); } else { List<Zone> new_chemin = new ArrayList<>(); enw_chemin.addAll(cheminList); // THIS LINE new_chemin.add(test_zone); chemins.add(new_chemin); zones_exclues.add(test_zone); } } chemin.remove(); } if (new_way) { return cherche_chemin(chemins, zones_exclues, zone_arrivee); } else { return null; } }
答案 1 :(得分:0)
你的问题是
if (test_zone == zone_arrivee) {
return chemin.next().get(1);
} else {
List<Zone> new_chemin = new ArrayList<>();
new_chemin.addAll(chemin.next()); // THIS LINE
new_chemin.add(test_zone);
chemins.add(new_chemin);
zones_exclues.add(test_zone);
}
封装它:(注意你的元素在这里改变)
if(chemin.hasNext()) {
if (test_zone == zone_arrivee) {
return chemin.next().get(1);
} else {
List<Zone> new_chemin = new ArrayList<>();
enw_chemin.addAll(chemin.next()); // THIS LINE
new_chemin.add(test_zone);
chemins.add(new_chemin);
zones_exclues.add(test_zone);
}
}
如果你想保持元素相同:
for (Iterator<List<Zone>> chemin = chemins.iterator(); chemin.hasNext();) {
List<Zone> zoneList = chemin.next();
for (Zone test_zone : zoneList.get(chemins.size() - 1).getVoisinsAccessible(zones_exclues)) {
new_way = true;
if (test_zone == zone_arrivee) {
return zoneList.get(1);
} else {
List<Zone> new_chemin = new ArrayList<>();
new_chemin.addAll(cheminList); // THIS LINE
new_chemin.add(test_zone);
zoneList.add(new_chemin);
zones_exclues.add(test_zone);
}
}
chemin.remove();
}