我有以下方法来评估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();
}
}