黑马程序员技术交流社区

标题: 关于在ArrayList中的一个习惯性错误! [打印本页]

作者: 李大强    时间: 2013-2-16 12:05
标题: 关于在ArrayList中的一个习惯性错误!
有一个题是这样说的:在一个ArrayList对象中存有若干个字符串元素,现欲遍历该ArrayList对象,
     删除其中所有值为"abc"的字符串元素,请用代码实现。
猛一看此题挺简单的,但却极易犯下一个习惯性的错误,具体的错误程序如下:
import java.util.ArrayList;
public class Test
{

public static void main(String[] args)
{
  
  ArrayList<String> aList=new ArrayList<String>();
  
  aList.add("abc");
  aList.add("abc");  
  aList.add("nice to meet you!");
  aList.add("abc");
  System.out.println("修改之前数据");
  printAllElements(aList);
  System.out.println("************************************");  
   
  String str=null;
  
  for(int x=0;x<aList.size();x++)//此时正在按照列表的大小进行遍历
  {
   str=aList.get(x);
   
   if("abc".equals(str))
    aList.remove(x);//此时在遍历的同时又进行了删除操作,由于列表是会自动的改变容量的,
             //所以此时被删元素之后的内容将会向前移动一位,此时如果后面的元素恰好是“abc”,但遍历的指针已经指向了此元素的后一位
           //这将直接导致一个符合条件的元素未被删除
   
  }
  
  printAllElements(aList);
}



public static void printAllElements(ArrayList<String> aList)
{
  for(String str:aList)
  {
   sop(str);
  }
}

public static void sop(String str)
{
  System.out.println(str);
}
}
此程序运行后的打印结果如下:
修改之前数据
abc
abc
abc
abc
abc
hello
nihoa
abc
nice to meet you!
abc
************************************
abc//
abc//可见已经漏掉了两个元素
hello
nihoa
nice to meet you!


其实正确的实现代码如下:

ListIterator<String> lt=aList.listIterator();  
  
  while(lt.hasNext())
  {   
   String str=lt.next();   
   if("abc".equals(str))
    lt.remove();   
  }

此时使用了列表迭代器,它可以再遍历的同时进行删除操作,而且指针不是角标,所以才不会出现错误!

作者: 愿㊡╃數曐曐メ    时间: 2013-6-3 13:56
我在测试题中也遇到这个问题!谢谢解答啦~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2