黑马程序员技术交流社区
标题:
关于Arraylist对象中删除“abc”字符串的一点疑问
[打印本页]
作者:
a2213502
时间:
2013-7-31 15:27
标题:
关于Arraylist对象中删除“abc”字符串的一点疑问
本帖最后由 杨兴庭 于 2013-8-1 18:47 编辑
import java.util.ArrayList;
import java.util.List;
public class Test2
{
public static void main(String[] args)
{
List<String> aList =new ArrayList<String>();
aList.add("abc");
aList.add("abc");
aList.add("abc");
aList.add("a");
aList.add("abc");
aList.add("abc");
aList.add("b");
aList.add("xyz");
aList.add("abc");
//原数组
System.out.print("原数组为");
for(int i=0;i<aList.size();i++)
{
System.out.printf("%8s",aList.get(i));
}
for(int i=0;i<aList.size();i++)
{
if(aList.get(i).equals("abc"))
{
aList.remove(i);
i--;//为什么要加这条语句呢? 不加的话,结果就出错了。
}
}
System.out.println("\n--------------------------------------------------------");
System.out.print("删除后的数组 :");
for(int i=0;i<aList.size();i++)
{
System.out.printf("%8s",aList.get(i));
}
}
}
作者:
李江
时间:
2013-7-31 15:32
aList.remove(i);//ArrayList的底层数据结构是数组,你用aList.remove(i)删除后,数据角标出现空位,导致数组访问角标错乱。可以用迭代器去删除,迭代器会自动排序。
作者:
冒烟的芒果
时间:
2013-7-31 16:16
因为调用remove方法后,后面的元素会往前移动
例如 remove(3) ;删除了第四个元素,第五个元素会已到第四个元素的位置,
如果不 把 i 减 1 的话 就漏掉了一个元素没有比较
作者:
草帽
时间:
2013-7-31 16:45
for(int i=0;i<aList.size();i++)
{
if(aList.get(i).equals("abc"))
{
aList.remove(i);
}
}
复制代码
楼主可以耐心分析以上代码,当第一次执行 aList.remove(i); 代码后aList的长度size()是发生变化的,而 i++也是是不断变化的,在for循环中会漏掉aList中的部分元素。
我这里简单分析一下:
当执行 aList.remove(i);后,aList的size就由9变为了8,第一个元素aList[0]中是“abc”的被remove后原来的aList[1]就成了aList[0],而这时 i++ 后已经变成了1,从而就把这个元素跳过去了。依次推就出现了错误结果。
一般这种都是用迭代器来进行操作的。当然,这里迭代器也只能进行remove操作,象添加,修改之类的就不行了。
作者:
a2213502
时间:
2013-7-31 19:04
哇 你们太给力了,一目了然,thanks
作者:
a2213502
时间:
2013-7-31 19:05
草帽 发表于 2013-7-31 16:45
楼主可以耐心分析以上代码,当第一次执行 aList.remove(i); 代码后aList的长度size()是发生变化的,而 i+ ...
thank,呵呵 分析的很详细
作者:
Mr_Free
时间:
2013-7-31 22:02
本帖最后由 Mr_Free 于 2013-7-31 22:06 编辑
草帽 发表于 2013-7-31 16:45
楼主可以耐心分析以上代码,当第一次执行 aList.remove(i); 代码后aList的长度size()是发生变化的,而 i+ ...
哥们,ListIterator 是可以添加删除修改的。
作者:
yangqing
时间:
2013-7-31 22:52
就是你删除了这个角标的元素时,后面的会缩进填充这个角标, 这个角标后面还要进行一次判断 所以要 i --
作者:
xwf4348
时间:
2013-8-1 09:05
你调用aList.remove(i)后,原来的元素删除了,就出现了空角标位。所以需要缩进填充这个空角标位,不然就错乱了。所以I--
作者:
低调的华丽
时间:
2013-8-1 09:55
调用remove方法之后,后面的元素会往前移动,会漏掉元素的
作者:
影响力147753321
时间:
2013-8-1 12:48
哥们你在比较干掉元素,当干掉元素时。集合会变小,后面的元素角标依次向前移动。遍历集合次数也相应少一次。
作者:
清心玉质
时间:
2013-8-1 18:30
为什么我把 i-- 注释掉后编译运行没有错误。。。
作者:
北极£莜蓝
时间:
2014-6-29 00:10
真不错,给力
作者:
winkyqin
时间:
2014-10-30 01:22
学习了!
作者:
齐宁宁
时间:
2014-10-31 08:54
赞一个!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2