对于一个含有若干个字符串的ArrayList集合,如果要删除其中所有的某个特定字符串(eg."abc"),应该如何实现呢?
很多同学不由自主会想到采用for循环遍历集合的方式,于是会有以下代码:
public class Test
{
public static void main(String[] args)
{
ArrayList<String> aList = new ArrayList<String>();
aList.add("abc");
aList.add("abc");
aList.add("abc");
aList.add("abc");
aList.add("abc");
aList.add("abc");
aList.add("abc");
aList.add("hjkhjk");
aList.add("abc");
aList.add("bcdabc");
aList.add("abcde");
aList.add("abcfds");
aList.add("abc");
aList.add("abcghi");
System.out.println("修改之前的aList为: ");
System.out.println(aList);
for(int i = 0;i < aList.size();i++)
{
if("abc".equals(aList.get(i)))
{
aList.remove(i);
}
}
System.out.println("删除所有‘abc’元素后的aList为: ");
System.out.println(aList);
}
}
殊不知,这种方式有欠考虑。也就是说,在某种情况下,ArrayList集合中的"abc"元素会出现删除不彻底的情形。为什么呢?这是因为随着for循环的不断执行,ArrayList集合中元素会减少,有可能出现i值跟ArrayList集合中元素个数相等或比之大的情况,这样,循环就会突然中断,于是,ArrayList集合中的元素也就可能没被删除干净。
那么,应怎样解决上面的问题呢?可以考虑以下两种方式:
(一)稍微修改上述for循环中代码,在remove()方法后面加上代码i = -1:
for(int i = 0;i < aList.size();i++)
{
if("abc".equals(aList.get(i)))
{
aList.remove(i);
i = -1;//只要ArrayList集合中元素被删除一个,就将i值重置为-1,当下次循环开始时,i值就变为0
}
}
[b](二)通过ArrayList的迭代器实现:
Iterator<String> iter = aList.iterator();//获取一个aList的迭代器
/**
* 遍历aList,逐一检查其中的字符串,直至所有值为"abc"的字符串全部删除为止
*/
while(iter.hasNext())
{
String str = iter.next();
if("abc".equals(str))
{
iter.remove();
}
}
不妥之处,请黑马论坛的大牛批评指正! |
|