问题描述
我做错了什么?为什么这个迭代器一直在运行?
default List<T> greedyAlgorithm() {
List<T> lst = new ArrayList<>();
T element = selection().next();
while(selection().hasNext()) {
if(feasibility(lst,element)) {
assign(lst,element);
} else {
element = selection().next();
}
if(solution(lst)){
return lst;
}
}
return null;
}
可行性函数检查元素是否可行,如果可行,则将元素分配到列表中。然后解决方案检查这是否是“算法”解决方案并返回列表,否则检查列表中的下一个元素。
解决方法
next
应始终在循环内执行。
如果 feasibility
条件不为 false
或 solution
,则它将继续运行而不前进。
我建议重新排列循环,以便您无条件地调用 next
。
如果 selection
每次调用都返回一个新的 Iterator
,也可能会出现问题。
也许是这样的:
default List<T> greedyAlgorithm() {
List<T> lst = new ArrayList<>();
for (
Iterator<T> selection = selection();
selection.hasNext();
) {
T element = selection.next();
if (feasibility(lst,element)) {
assign(lst,element);
if (solution(lst)) {
return lst;
}
}
}
return null;
}
如果 selection()
返回一个 Iterable
,您可以使用华丽的 for 循环。通常返回一个类型,例如 Iterable
,它(种类)不会改变内部状态比一个类型更好,例如 Iterator
(虽然有 remove
所以 {{1 }} 并不完全是无辜的)。