繁体   English   中英

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;
}

可行性 function 检查元素是否可行,如果是,则将元素分配给列表。 然后解决方案检查这是否是“算法”解决方案并返回列表,否则检查列表中的下一个元素。

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之类的(某种)不会改变内部 state 的类型比诸如Iterator之类的类型要好(尽管有remove所以Iterable.iterator并非完全无辜)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM