黑马程序员技术交流社区

标题: 删除其中所有值为"abc"的字符串元素 [打印本页]

作者: suiabing    时间: 2012-5-3 21:47
标题: 删除其中所有值为"abc"的字符串元素
int size =alist.size();
for(int i = 0; i < size;i++) {
  if("abc".equals(alist.get(i))){
    alist.remove(i);;    //运行失败,
  }
}


删除其中所有值为"abc"的字符串元素 如何实现呢


{"aaa","abc","abc","adg","abc"}

作者: Friends★    时间: 2012-5-3 22:25

/*集合的做法:
*
*   希望可以帮到你。
* */

import java.util.*;
class  Test20
{
        public static void main(String args[])
        {
                ArrayList  al= new ArrayList();
               
               
                al.add("aaa");
                al.add("abc");
                al.add("abc");
                al.add("adg");
                al.add("abc");
               
                 ListIterator li=al.listIterator();
                 
                   while(li.hasNext())
                   {
                           Object  obj=li.next();
                          
                           if(obj.equals("abc"))
                           {
                                li.remove();
                           }
                          
                          
                   }
                   sop(al);
        }
       
        public static void sop(Object  obj)
        {
                System.out.println(obj);
        }
}

运行结果:

[aaa, adg]

作者: suiabing    时间: 2012-5-3 22:28
Friends★ 发表于 2012-5-3 22:25
/*集合的做法:
*
*   希望可以帮到你。

源代码别给人家改掉!改for循环体,这个是一个小考题
作者: 贾联国    时间: 2012-5-3 22:41
本帖最后由 贾联国 于 2012-5-3 22:43 编辑

本来size是4,你循环给删了个值,集合长度是3了,可你的size还是4,肯定会角标越界异常的!

for(int i = 0; i < size;i++) {
   if("abc".equals(alist.get(i)))
   { System.out.println(1);
     alist.remove(i);
     size--;  //注意这里
   }
作者: 魏征    时间: 2012-5-3 22:42
用ListIterator进行迭代
ListIterator<String> lt=alist.listIterator();
        while (lt.hasNext())
        {
                String s=lt.next();
                if ("abc".equals(s))
                {
                        lt.remove();
                }
        }
        System.out.println(alist);
作者: 陈苓    时间: 2012-5-3 22:50
   有个linkenItertor可以做到在迭代元素的过程中实现增删改
作者: 符云爵    时间: 2012-5-4 10:28
3楼解释是清楚了,但是代码还是有bug的,比如说,集合里总共有5条数据:“qqq”,"www","abc","abc","aaa",这样一来,当i加到2时,也就是到了第三条,这个时候条件符合了,把该条移除,而循环到下次时i还是会+1的,那就要注意了,后边的数据,从第4条开始,它会往上移,也就是说一开始下标为3的在移除本来下标为2的那项之后,它的下标跟着会变为2,但i依然+1,这样你就不会再循环到本来下标为3的那条数据了(因为移除第一条之后它的下标已经变为2).如果一定要用for循环的话,考虑下下面的代码,不过要注意不要进死循环了:
List<String> list = new ArrayList<String>();
                list.add("adsd");
                list.add("asww");
                list.add("abc");
                list.add("abc");
                list.add("ff");
                list.add("fcxasd");
               
                for (int i = 0; i < list.size();) {
                        if(list.get(i).equals("abc")){
                                list.remove(i);
                        }else{
                                i++;
                        }
                }
作者: 褚代江    时间: 2012-5-4 10:41
符云爵 发表于 2012-5-4 10:28
3楼解释是清楚了,但是代码还是有bug的,比如说,集合里总共有5条数据:“qqq”,"www","abc","abc","aaa", ...

顶7楼。讲的很透彻,巩固了这种for(*;*;){*}的使用




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