Java LinkedList NoSuchElementException



我有以下方法来评估VRP路由的开销,但是它会抛出java.util.NoSuchElementException

起初我认为问题是在第一次迭代,其中iterator.next()是空的,这就是为什么我添加了布尔firststiation,但问题仍然存在!

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

如果firstIteration为真,您仍然需要调用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); 
}

在第一个节点上调用.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()); 
    }

}

我用这个简单的方法修复了它:

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

相关内容

  • 没有找到相关文章

最新更新