黑马程序员技术交流社区

标题: 关于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
  1. for(int i=0;i<aList.size();i++)
  2.                 {
  3.                         if(aList.get(i).equals("abc"))
  4.                         {
  5.                                 aList.remove(i);
  6.                              
  7.                        }
  8.                                        
  9.                 }
复制代码
楼主可以耐心分析以上代码,当第一次执行 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