【问题标题】:Element goes missing during iteration of ArraylistArraylist 迭代期间元素丢失
【发布时间】:2010-07-18 02:24:30
【问题描述】:

有人可以向我解释一下下面的代码有什么问题吗?

public static void main(String[] args) {
 List<String> l = new ArrayList<String>();
  l.add("1");
  l.add("2");
  l.add("3");
  l.add("4");

  for (int i = 0; i < l.size(); i++) {
   if(l.get(i).equals("1"))
    l.remove(l.get(i));
   else
    System.out.println(l.get(i));
  }
 }

给我一​​个 [3.4] 而不是 [2,3,4] 的输出 .. 我的 [2] 呢?我对 List 的这种行为感到困惑。如果有人能解释一下,那就太好了。。

提前致谢:)

【问题讨论】:

  • 如果只能使用l.remove(i),为什么还要使用l.remove(l.get(i))

标签: java list collections arraylist


【解决方案1】:

原因是:
当 i = 0 时,您删除第一个元素并且 i 变为 1
当 i = 1 时,您现在位于第三个元素,因为您已将所有内容向下移动 1,因此您写为“3”
当 i = 2 你写第三个元素是“4”

给你一个“3”,“4”的输出

另一种实现可能是:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Item {
    public static void main(String[] args) {
        List<String> l = new ArrayList<String>();
        l.add("1");
        l.add("2");
        l.add("3");
        l.add("4");

        Iterator<String> iter = l.iterator();
        while(iter.hasNext())
        {
            String value = iter.next();
            if("1".equals(value))
            {
                iter.remove();
            }
            else
            {
                System.out.println(value);
            }
        }
    }
}

【讨论】:

  • 您绝对应该尽可能使用迭代器删除元素,以避免手动减少索引变量。这样就安全多了。当然,你不能总是使用它,但如果可以,请使用它。
【解决方案2】:

调用l.remove 后,当前元素 (l.get(i)) 最终成为下一个元素 ("2")。
但是,在调用remove 之后,您会继续循环并最终跳过该元素。

要解决此问题,您可以在if 中添加i--,以便下一次迭代处理新的当前元素(在i++ 之后)

【讨论】:

    【解决方案3】:

    SLaks 关于问题是正确的,我可能会建议更像这样的语法。

    int i=0;
    while(i < l.size())
    {
      if(l.get(i).equals("1"))
        l.remove(l.get(i));
      else
      {
        System.out.println(l.get(i++));
      }
    }
    

    【讨论】:

    • 好的.. 一个迭代器为我完成了这项工作.. 但是你。糟糕的错误..再次感谢大家:)
    【解决方案4】:

    如果你把 else 去掉,它会给你想要的功能。

    List<String> l = new ArrayList<String>();
    l.add("1");
    l.add("2");
    l.add("3");
    l.add("4");
    
    for (int i = 0; i < l.size(); i++) {
    
        if(l.get(i).equals("1"))
            l.remove(l.get(i));
    
        System.out.println(l.get(i));
    }
    

    【讨论】:

      猜你喜欢
      • 2015-01-02
      • 2014-06-13
      • 2015-12-01
      • 1970-01-01
      • 2021-11-21
      • 1970-01-01
      • 2016-02-26
      • 2013-01-29
      相关资源
      最近更新 更多