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 条件不是 falsesolution 真,那么它会保持 运行 不前进。

我建议重新安排循环,以便您无条件调用 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 并非完全无辜)。