黑马程序员技术交流社区

标题: 集合List元素移除 [打印本页]

作者: 彭润生    时间: 2012-9-19 21:24
标题: 集合List元素移除
本帖最后由 彭润生 于 2012-9-19 22:43 编辑

public class Demo{
public static void main(String[] args)throws Exception{
  List<String> l = new ArrayList<String>();
  l.add("Java08");
  l.add("Java07");
  l.add("Java06");
  l.add("Java05");
for(int x = 0;x<l.size();x++){
  l.remove(x);
}
System.out.println(l);
}
把集合里面的元素移除完了,怎么还有元素啊?
下面是结果,为什么啊.里面还有元素啊??
[Java07, Java05]
作者: 赵宇    时间: 2012-9-19 21:35
不能这么移除。
你吧size变量定义在外面,然后用那个变量来移除
int num=l.size();
for(int x = 0;x<num;x++){
改成这样

作者: 张 涛    时间: 2012-9-19 21:37
你用for循环去移除元素。
开始时,list中有4个,“8 7 6 5”,你移除第0个,list变为“7 6 5”,x++变为1,size此时为3;然后你移除第1个,list变为“7 5”,x++变为2,size此时为2;所以不会再循环下去。

最后还剩两个元素“7 5”

你是没明白remove方法。建议看下API
作者: 彭润生    时间: 2012-9-19 21:39
疯子雨 发表于 2012-9-19 21:35
不能这么移除。
你吧size变量定义在外面,然后用那个变量来移除
int num=l.size();

这样抛异常
作者: 彭润生    时间: 2012-9-19 21:40
张 涛 发表于 2012-9-19 21:37
你用for循环去移除元素。
开始时,list中有4个,“8 7 6 5”,你移除第0个,list变为“7 6 5”,x++变为1, ...

呵呵,知道remove返回移除的值。我在去看看。
作者: 赵宇    时间: 2012-9-19 21:42
在说了 移除集合的元素也没必要那样移除,直接调用方法就行

深深深.jpg (5.68 KB, 下载次数: 70)

深深深.jpg

作者: 严海荣    时间: 2012-9-19 21:46
  1. import java.util.*;

  2. public class Demo{
  3.         public static void main(String[] args)throws Exception
  4.         {
  5.           List<String> l = new ArrayList<String>();
  6.           l.add("Java08");
  7.           l.add("Java07");
  8.           l.add("Java06");
  9.           l.add("Java05");
  10.           ListIterator li = l.listIterator();
  11.           while(li.hasNext())
  12.           {
  13.                   li.next();
  14.                   li.remove();
  15.           }
  16.           System.out.println(l);
  17. }
复制代码
用ListIterator吧,它里面有自己的移除方法。而你的问题应该是,循环操作时,使用了容器的方法操作,
导致你的size()大小变化了,所以一般不要并发修改,要么用容器的方法,要么都用迭代器的方法。
作者: 武庆东    时间: 2012-9-19 21:48
public class Demo{
public static void main(String[] args)throws Exception{
  List<String> l = new ArrayList<String>();
  l.add("Java08");
  l.add("Java07");
  l.add("Java06");
  l.add("Java05");
for(int x = 0;x<l.size();x++){  //原因在这里,每一次remove()后,对象l.size()就发生一次变化
  l.remove(x);
}
System.out.println(l);
}
把集合里面的元素移除完了,怎么还有元素啊?
下面是结果,为什么啊.里面还有元素啊??
解答:原因在这里,每一次remove()后,对象l.size()就发生一次变化~你可以自己测试一下:
for(int x = 0;x<l.size();x++)
    {   System.out.println("大小:"+l.size());
        System.out.println(x);
        System.out.println(l.get(x));
        l.remove(x);
    }

作者: 赵永康    时间: 2012-9-19 21:54
因为集合是可变长度的,当你第一次删除的时候,假如你删掉了java08,这时候i++就是1了指针指向了第2个位置。但是由于集合的特性,长度变成了3 整体向前移一位,指针相当于指向了java06,这时候就把java06删去了  i在++的时候,同时集合元素整体再向前移一位,这时候指针指不到元素了
你应该写成这样for(int i=0;i<l.size();i++){l.remove(i--);}这就保证了永远指针能指向每一个元素,
鉴于本人画图不够熟练 希望 文字你能明白点!!!
作者: 彭润生    时间: 2012-9-19 21:58
张 涛 发表于 2012-9-19 21:37
你用for循环去移除元素。
开始时,list中有4个,“8 7 6 5”,你移除第0个,list变为“7 6 5”,x++变为1, ...

明白了,呵呵谢谢
作者: 彭润生    时间: 2012-9-19 21:59
武庆东 发表于 2012-9-19 21:48
public class Demo{
public static void main(String[] args)throws Exception{
  List l = new ArrayList( ...

了解了,哈哈
作者: 彭润生    时间: 2012-9-19 21:59
赵永康 发表于 2012-9-19 21:54
因为集合是可变长度的,当你第一次删除的时候,假如你删掉了java08,这时候i++就是1了指针指向了第2个位置 ...

明白了,呵呵

作者: 张小龙    时间: 2012-9-19 22:07
第一个是因为每次循环的时候,list的长度都在变化,所以导致你只删了两个就停止了。

第二个你是想说插入到指定位置吗,需要加参数的 参数类型如下:

add(int index, E element)
          在列表的指定位置插入指定元素(可选操作)。

作者: 彭润生    时间: 2012-9-19 22:43
张小龙 发表于 2012-9-19 22:07
第一个是因为每次循环的时候,list的长度都在变化,所以导致你只删了两个就停止了。

第二个你是想说插入到 ...

大意了。知道了哈
作者: 董志超    时间: 2012-9-20 09:23
import java.util.*;
public class Demo
{
        public static void main(String[] args)throws Exception
        {
                  List<String> l = new ArrayList<String>();
                  l.add("Java08");
                  l.add("Java07");
                  l.add("Java06");
                 l.add("Java05");
                for(int x = 0;x<l.size();x++)
                {
                          l.remove(x);
                }
                System.out.println(l);
        }
}
每移除一次,l.size()值就减一所以导致那样的结果
可以使用迭代器
作者: 明光照    时间: 2012-9-20 10:28
直接用Removeall()方法不行




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