使用&#34; addAll&#34;复制列表<object>;方法NoSuchElementException </object>

时间:2014-11-14 18:56:01

标签: java list nosuchelementexception

我认为我的代码存在问题,但我无法找到原因。 当我使用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;
    }
}

2 个答案:

答案 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)

请阅读NoSuchElementException

你的问题是

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();
}