元素在Arraylist迭代期间失踪

时间:2010-07-18 02:24:31

标签: java list collections arraylist

有人可以向我解释下面这段代码的错误吗?

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]是什么?我对列表中的这种行为感到困惑。如果有人可以解释那么好......

提前致谢:)

4 个答案:

答案 0 :(得分:5)

原因是:
当i = 0时,你删除第一个元素,然后我变成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);
            }
        }
    }
}

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:-1)

如果你把别人拿走,它会给你所需的功能。

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