A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李大强 中级黑马   /  2013-2-16 12:05  /  1896 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

有一个题是这样说的:在一个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();   
  }

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

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

1 个回复

倒序浏览
我在测试题中也遇到这个问题!谢谢解答啦~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马