黑马程序员技术交流社区

标题: ArrayList的问题 [打印本页]

作者: 揭耀祖    时间: 2012-5-24 19:07
标题: ArrayList的问题
  ArrayList<String>  list = new ArrayList<String>();

  list.add("java");
  list.add("abc");
  list.add("java");
  list.add("bcd");
  list.add("java");
  list.add("java");

for(int i=0;i<list.size();i++)
  {
        if("java".equals(list.get(i)))
          {
             list.remove(i);
          }
  }
  System.out.println(list);
为什么输出的是abc bcd java 而不是 abc bcd
那个"java"为什么就是删不掉?

作者: 胥江    时间: 2012-5-24 19:20
if("java".equals(list.get(i).toString()))
          {
             list.remove(i);
          }
加个toString()试下看
作者: niceBoy    时间: 2012-5-24 19:24
for(int i=0;i<list.size();i++)循环一次list.size就变一次
作者: 胥江    时间: 2012-5-24 19:26
奥,不好意思 回答错了
应该是最后那里list.remove(i);
应该是i的下表越界了  但不知道怎么没报错,应为i的值应该是5了,前面应景消除了2个应该岳杰了
import java.util.ArrayList;

class test{
        public static void main(String []args){
                ArrayList<String>  list = new ArrayList<String>();
                  list.add("java");
                  list.add("abc");
                  list.add("java");
                  list.add("bcd");
                  list.add("java");
                  list.add("java");

                for(int i=0;i<list.size();i++)
                  {
                        if("java".equals(list.get(i).toString()))
                          {
                             list.remove(i);
                          }
                  } list.remove(2);
                  System.out.println(list);
        }
}

结果就没"java"了
作者: 黑马张健    时间: 2012-5-24 19:57
本帖最后由 黑马张健 于 2012-5-24 20:54 编辑

删不掉,是因为ArrayList集合,是一个有序集合,元素的角标会随着你的删除,自动往前。
比如一个集合                               list["a","b","c","d","e"]
开始对应的元素下标分别是:                     0    1   2   3    4
删除了其中一个c之后,下标,就开始改变了    list["a","b","d","e"]
                                                                           0    1    2   3
                   list.add("java");
                   list.add("abc");
                   list.add("java");
                   list.add("bcd");
                   list.add("java");
                   list.add("java");
list["java","abc","java","bcd","java","java"]
         0     1        2       3       4       5
for循环删除一个java后:集合变为
list["abc","java","bcd","java","java"]
         0     1        2       3       4      
当i++后成为1
这时把下标为1的元素取到,并删除后集合元素下标如下
list["abc","bcd","java","java"]
         0     1         2       3  
当i++后成为2
这时把下标为2的元素取到,并删除后集合元素下标如下
list["abc","bcd","java"]
         0     1         2        
当i++为3时,不满足for循环的条件。
所以打印abc、bcd、java


作者: 魏涞    时间: 2012-5-24 20:05
  ArrayList<String>  list = new ArrayList<String>();

  list.add("java");
   list.add("abc");
   list.add("java");
   list.add("bcd");
   list.add("java");
   list.add("java");

for(int i=0;i<list.size();i++)
   {
         if("java".equals(list.get(i)))
           {
              list.remove(i); //这里应该是list.remove(i--);看来LZ还没有理解透ArrayList的性质,ArrayList是动态进行存储的,当remove掉一个元素后,在操作的元素角标后面的元素会往前移,并且ArrayList的长度会减一。
           }
   }
   System.out.println(list);

作者: 孙如意    时间: 2012-5-24 20:17
import java.util.ArrayList;

public class Test{
        public static void main(String []args){
                ArrayList<String>  list = new ArrayList<String>();
                  list.add("java");
                  list.add("abc");
                  list.add("java");
                  list.add("bcd");
                  list.add("java");
                  list.add("java");
                for(int i=0;i<list.size();i++)
                  {
                        if("java".equals(list.get(i).toString()))
                          {
                             list.remove(i);
                             i--;
                          }
                        
                  }
                  System.out.println(list);
        }
}
正如上上楼所说,Arraylist删除后下标减小,所以下表也要减小........{:soso_e100:}
作者: 胥江    时间: 2012-5-24 20:21
那撒没有报下标越界错误!
作者: 揭耀祖    时间: 2012-5-24 20:29
我现在懂了,谢谢大家。
作者: 孙如意    时间: 2012-5-24 20:32
呵呵,有问题大家解决就是快啊,,,{:soso_e100:}
作者: 袁錦泰    时间: 2012-5-24 22:20
List集合中的remove()方法是會改變集合長度的,視頻裏面應該說到了吧?
作者: 谭威    时间: 2012-5-24 22:30
呵呵。接下来如果用迭代器的话你就会明白。next()的作用
作者: 高云飞    时间: 2012-5-24 22:41
这样的操作,你应该用listIterator来进行。




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