【问题标题】:Java Iterator - infinite loopJava 迭代器 - 无限循环
【发布时间】:2021-05-16 10:28:24
【问题描述】:

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

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

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

【问题讨论】:

  • 方法selection()做了什么并返回?它是否返回Iterator?您可能应该调用它一次并将Iterator 保存在变量中并使用它,而不是多次调用它。如果每次调用它都返回一个新的Iterator,那么你的循环将是无限的。
  • 是的选择返回一个迭代器,谢谢,尝试你的想法

标签: java iterator


【解决方案1】:

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所以Iterable.iterator不是完全无辜的) .

【讨论】:

    猜你喜欢
    • 2015-03-02
    • 2017-09-08
    • 2017-05-02
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多