黑马程序员技术交流社区

标题: 高级for循环 [打印本页]

作者: 郭军亮    时间: 2013-5-29 17:32
标题: 高级for循环
[code] public static void main(String[] args) {   
  
        ArrayList<String> al = new ArrayList<String>();   
           
        al.add("haha");   
        al.add("abc");   
        al.add("abc");   
        al.add("abc");      
        for(String str:al){
                if("abc".equals(str)){   
                al.remove(str); //为什么这里会报错呢
        }
           
     
作者: 廖志强    时间: 2013-5-29 18:02
我来来编译了下,al 和str 都是应用对象啊,你是要把相同的元素删除的话,E remove(int index) 是表示移除制定位置的元素,楼主传的是一个对象,boolean remove(Object o)  移除此列表中首次出现的指定元素(如果存在)。 这两个方法你最好看下API,传的参数不对。
作者: 小石头39910    时间: 2013-5-29 18:07
貌似与remove的返回类型有关系

作者: Super_Class    时间: 2013-5-29 18:07
        方法一:使用迭代器的子接口:ListIterator 列表迭代器
                                系列表迭代器,允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。ListIterator
                                没有当前元素;它的光标位置
                                始终位于调用 previous() 所返回的元素和调用 next() 所返回的元素之间。
         
                                Iterator<String> iterator = list.iterator();
                                改为  ListIterator iterator = list.listIterator();

                        方法二:使用集合的实现子类:CopyOnWriteArrayList
                                List list = new ArrayList(); 改为
                                List list = new CopyOnWriteArrayList();
作者: Super_Class    时间: 2013-5-29 18:10
小石头39910 发表于 2013-5-29 18:07
貌似与remove的返回类型有关系

美女,你很活跃啊。但是你的回答能不能肯定一点。什么叫貌似。。。
作者: 翟宝海    时间: 2013-5-29 18:10
本帖最后由 翟宝海 于 2013-5-29 18:50 编辑

在遍历集合过程中,增强for循环可以对集合本身进行增删操作:
因为ArrayList的父类 Abstract  List 里有个modCount的字段记录着List的总数,增强for循环的时候如果增加或者删除了元素(修改不会影响),这个字段会变化,那么在下次for循环的时候检查到跟之前的长度不同,此时会报ConcurrentModificationException异常。
  1. import java.util.*;
  2. class Test
  3. {
  4.         public static void main(String[] args)
  5.         {   
  6.             ArrayList<String> al = new ArrayList<String>();   
  7.             al.add("haha");   
  8.             al.add("abc");   
  9.             al.add("abc");   
  10.             al.add("abc");      
  11.             Iterator it = al.iterator();
  12.             ArrayList<String> al2 =  new ArrayList<String>();
  13.               while(it.hasNext())
  14.         {  
  15.                 Object obj = it.next();
  16.                 if("abc".equals(obj))
  17.                 al2.add((String)obj);
  18.             }
  19.                 System.out.println(al2);
  20.                 al.removeAll(al2);
  21.                 System.out.println(al);         
  22.         }
  23. }
复制代码

作者: 小石头39910    时间: 2013-5-29 18:13
Super_Class 发表于 2013-5-29 18:10
美女,你很活跃啊。但是你的回答能不能肯定一点。什么叫貌似。。。

亲,我木有学高级循环哦,我只是看了一下,不敢妄自菲薄,so,你懂得,菜鸟一枚
作者: Super_Class    时间: 2013-5-29 18:16
小石头39910 发表于 2013-5-29 18:13
亲,我木有学高级循环哦,我只是看了一下,不敢妄自菲薄,so,你懂得,菜鸟一枚 ...

对你来说,感觉你学的也不短了。估计高级的foreach 3分钟也就搞定了

谦虚过了就不好了
作者: Akm    时间: 2013-5-29 18:21
  1. http://www.cnblogs.com/frankliiu-java/articles/1759460.html
复制代码
参考相关 帖子 ,你应该就美白了, 自从有了搜索,老师再也不用担心我的学习...
作者: 李润根    时间: 2013-5-29 18:22
迭代的时候,不能删除,建议多看视频




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2