微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java迭代器——无限循环

如何解决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 }} 并不完全是无辜的)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。