Java迭代器——无限循环

问题描述

我做错了什么?为什么这个迭代器一直在运行?

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 条件不为 falsesolution,则它将继续运行而不前进。

我建议重新排列循环,以便您无条件地调用 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 }} 并不完全是无辜的)。