有一个题是这样说的:在一个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();
}
此时使用了列表迭代器,它可以再遍历的同时进行删除操作,而且指针不是角标,所以才不会出现错误!
|