我有以下方法来评估VRP路由的开销,但它会抛出java.util.NoSuchElementException。
起初我认为问题出现在第一次迭代中,iterator.next()为null,这就是我添加布尔值firstIteration的原因,但问题仍然存在!
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。
答案 0 :(得分:3)
如果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);
}
答案 1 :(得分:0)
你在第一个节点上调用.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());
}
}
答案 2 :(得分:0)
我用这个简单的方法修复它:
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();
}
}