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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 杨兴庭 于 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));
                }
        }
        
}

评分

参与人数 1黑马币 +3 收起 理由
万琪 + 3

查看全部评分

14 个回复

倒序浏览
aList.remove(i);//ArrayList的底层数据结构是数组,你用aList.remove(i)删除后,数据角标出现空位,导致数组访问角标错乱。可以用迭代器去删除,迭代器会自动排序。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报 1 0
因为调用remove方法后,后面的元素会往前移动
例如 remove(3) ;删除了第四个元素,第五个元素会已到第四个元素的位置,
如果不 把 i 减 1 的话 就漏掉了一个元素没有比较

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
  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操作,象添加,修改之类的就不行了。

评分

参与人数 2技术分 +1 黑马币 +30 收起 理由
杨兴庭 + 1
hx32 + 30 最喜欢代码解释的童鞋,我也学习到了.

查看全部评分

回复 使用道具 举报
哇 你们太给力了,一目了然,thanks
回复 使用道具 举报
草帽 发表于 2013-7-31 16:45
楼主可以耐心分析以上代码,当第一次执行 aList.remove(i); 代码后aList的长度size()是发生变化的,而 i+ ...

thank,呵呵 分析的很详细
回复 使用道具 举报
本帖最后由 Mr_Free 于 2013-7-31 22:06 编辑
草帽 发表于 2013-7-31 16:45
楼主可以耐心分析以上代码,当第一次执行 aList.remove(i); 代码后aList的长度size()是发生变化的,而 i+ ...

哥们,ListIterator 是可以添加删除修改的。
回复 使用道具 举报
就是你删除了这个角标的元素时,后面的会缩进填充这个角标, 这个角标后面还要进行一次判断 所以要  i --  
回复 使用道具 举报
你调用aList.remove(i)后,原来的元素删除了,就出现了空角标位。所以需要缩进填充这个空角标位,不然就错乱了。所以I--
回复 使用道具 举报
调用remove方法之后,后面的元素会往前移动,会漏掉元素的
回复 使用道具 举报
哥们你在比较干掉元素,当干掉元素时。集合会变小,后面的元素角标依次向前移动。遍历集合次数也相应少一次。
回复 使用道具 举报
为什么我把 i-- 注释掉后编译运行没有错误。。。
回复 使用道具 举报
真不错,给力
回复 使用道具 举报
学习了!
回复 使用道具 举报
赞一个!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马