【问题标题】:ArrayList for loop iterator causing infinite loopArrayList for 循环迭代器导致无限循环
【发布时间】:2017-05-02 09:11:02
【问题描述】:

我正在尝试遍历 ArrayList 并打印其中的每个元素,但它只输出 ArrayList 中的第一个元素。然后是一个无限循环,它不断打印出第一个元素。

ArrayList<String> startTime = new ArrayList<String>();

for (int i = 0; i < startTime.size(); i++) {
    String getTime = startTime.get(i);
    getTime = convertTime(getTime);
    startTime.add(i, getTime);
    System.out.println(startTime.get(i));
}

【问题讨论】:

  • 那是因为您在循环中调用了startTime.add(i, getTime); - 您在循环的每次迭代中都向列表中添加了一个元素。为什么要添加那行?删除它。
  • 鉴于这里的代码,我不知道为什么您会期望有什么不同,您正在访问数组列表,然后添加到它。因此,无穷大。
  • 这是因为您一次又一次地获取数据、覆盖它、获取数据、覆盖它等等,直到无穷大。没有尽头。当你达到某个基准并在那里打破时,也许你可以设置一个 if else 条件。

标签: java for-loop arraylist iterator


【解决方案1】:

您可以尝试向后循环(从最后一个元素到第一个元素),例如:

// assume that I have ArrayList variable named *list*

for(int i = list.size() - 1 ; i >= 0 ; i--){
    list.add(//something);
}

此代码不会给您一个无限循环,因为即使您的列表大小不断变化,循环控制变量也永远不会改变( i >= 0 )。下限将始终为 0,i 将向 0

递减

【讨论】:

    【解决方案2】:

    尝试使用这个 for 循环:

    for(int i=0,n=startTime.size();i<n;i++){
        //your for-loop code here  
    
    }
    

    当您向startTime 添加元素时,它的大小正在增加。因此,它提高了i 必须无限满足的边界。在我的示例中,n 将在循环开始时设置为 startTime 的大小,并且不会随着循环的执行而改变。

    【讨论】:

      【解决方案3】:

      当您执行startTime.add(i, getTime) 时,您将在i 位置添加一个元素。这意味着在您的下一次迭代中,您的列表中将有一个额外的元素。当您增加计数器并检查startTime.size() 时,它始终是true。因此你的无限循环。

      作为建议,如果您想添加 getTime 元素,您可能需要使用某种辅助结构,例如另一个 List。

      【讨论】:

        【解决方案4】:

        一定要使用高级 for 循环:

        ArrayList<String> startTime = new ArrayList<String>();
        for(String aStartTime: startTime){
          // do something
        }
        

        【讨论】:

        • 这可能会解决他的循环问题,但它不会解决操作员明确寻找的所需更新行为。
        • 嗨@DejaVuSansMono,感谢您的反馈。我不明白 op 试图达到什么目的。代码对我来说没有意义,文本可能更具表现力。
        • 这很公平。 OP 没有很好地解释所需的行为。我自己可能解释错了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-03
        • 2016-02-14
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        相关资源
        最近更新 更多