Java LinkedList NoSuchElementException - PullRequest
1 голос
/ 28 ноября 2011

У меня есть следующий метод, который оценивает стоимость маршрута VRP, но он выдает исключение java.util.NoSuchElementException.

Сначала я подумал, что проблема была в первой итерации, где iterator.next() является нулевым, и поэтому я добавил логическое первое изменение, но проблема остается!

private void evaluateRouteCost () {

    ListIterator<VRPNode> iterator = this.routeList.listIterator();

    boolean firstIteration=true;

    while (iterator.hasNext()) {

        if (firstIteration) {
            firstIteration=false;
        }

        else {
            this.routeCost += vrp.distance(iterator.previous(), iterator.next()); 
        }

    }

Обратите внимание, что routeList является LinkedList.

Ответы [ 3 ]

3 голосов
/ 28 ноября 2011

Если firstIteration равно true, вам все равно нужно вызвать iterator.next() (иначе вы все равно будете на первом элементе во второй итерации).

Однако я бы написал это немного по-другому:

ListIterator<VRPNode> iterator = this.routeList.listIterator();

while (iterator.hasNext()) {

    VRPNode current = iterator.next();

    if (iterator.hasPrevious())
        this.routeCost += vrp.distance(iterator.previous(), current); 

}
0 голосов
/ 28 ноября 2011

Я исправил это простым способом:

public void evaluateRouteCost () { //http://bit.ly/t76G1Z

    ListIterator<VRPNode> iterator = this.routeList.listIterator();

    while(iterator.hasNext()) {

        int currentId, nextId;

        currentId=iterator.next().getId();

        try {
            nextId=iterator.next().getId();
        }
        catch (NoSuchElementException e) {
            // when reaches the last element
            break;
        }

        this.routeCost += vrp.distance(currentId, nextId);

        iterator.previous();    
    }

}
0 голосов
/ 28 ноября 2011

Вы звоните .previous на первом узле. Также: вы можете упростить это до:

private void evaluateRouteCost () {

    ListIterator<VRPNode> iterator = this.routeList.listIterator();

    boolean firstIteration=true;

    if (iterator.hasNext()) {
      iterator.next();
    }    

    while (iterator.hasNext()) {
        this.routeCost += vrp.distance(iterator.previous(), iterator.next()); 
    }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...