Java 迭代器 - 无限循环
Java Iterator - infinite loop
我做错了什么?为什么这个迭代器保留 运行?
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;
}
可行性函数检查元素是否可行,如果是则将元素分配给列表。然后解决方案检查这是否是 'algo' 解决方案和 returns 列表,否则检查列表中的下一个元素。
next
应始终在循环内执行。
如果 feasibility
条件不是 false
或 solution
真,那么它会保持 运行 不前进。
我建议重新安排循环,以便您无条件调用 next
。
如果每次调用 selection
returns 一个新的 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
所以 Iterable.iterator
并非完全无辜)。
我做错了什么?为什么这个迭代器保留 运行?
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;
}
可行性函数检查元素是否可行,如果是则将元素分配给列表。然后解决方案检查这是否是 'algo' 解决方案和 returns 列表,否则检查列表中的下一个元素。
next
应始终在循环内执行。
如果 feasibility
条件不是 false
或 solution
真,那么它会保持 运行 不前进。
我建议重新安排循环,以便您无条件调用 next
。
如果每次调用 selection
returns 一个新的 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
所以 Iterable.iterator
并非完全无辜)。