读书人

ArrayList 的删除的小疑点

发布时间: 2012-06-01 16:46:36 作者: rapoo

ArrayList 的删除的小问题,在线等
ArrayList的初始化内容如下:
ArrayList list = new ArrayList();
list.add("java");
list.add("aaa");
list.add("java");
list.add("java");
list.add("bbb");
下面可以删除list中所有的“java”的代码是:

A.for (int i = list.size() - 1; i >= 0; i--) {
if ("java".equals(list.get(i))) {
list.remove(i);
}
}

B.for (int i = 0; i < list.size(); i++) {
if ("java".equals(list.get(i))) {
list.remove(i);
}
}

请问,为什么只有A可行,B为什么不行呢 thanks

[解决办法]
B 当你第一次移除的时候是1个 也就是list.remove(0),当循环进行到 i=3时 你之前 已经移除了 0 1 2,也就是移除了三个,而你的集合里面总共才五个值 移除了三个了 最后只剩下两个了,当你再去移除list.remove(3)时,而3根本不存在了,会出现数组越界异常的。
[解决办法]
B : list.remove(i);后面加上i--
[解决办法]
B,当然不行,比如B中,起始的时候 for循环中 i < 5 , 删除掉一个,那么list.size() = 4,那么 此时
list.get(3)才是list的最后一个元素 ,而for循环中 i会一直循环到 4,此时 list.get(4),报 list越界啦
[解决办法]
两种写法都是错误的 会数组越界,
A.for (int i = list.size() - 1; i >= 0; i--) {
if ("java".equals(list.get(i))) {
list.remove(i);
i= i+1 ;
}
}

B.for (int i = 0; i < list.size(); i++) {
if ("java".equals(list.get(i))) {
list.remove(i);
i= i-1 ;

}
}


[解决办法]

探讨
B : list.remove(i);后面加上i--

[解决办法]
我也错了,A也应该i--
[解决办法]
探讨
两种写法都是错误的 会数组越界,
A.for (int i = list.size() - 1; i >= 0; i--) {
if ("java".equals(list.get(i))) {
list.remove(i);
i= i+1 ;
}
}

B.for (int i = 0; i < list.size(); i++) {
if ("java……

[解决办法]
A数组会越界,B不会,所以A可以B不行
[解决办法]
探讨
引用:
两种写法都是错误的 会数组越界,
A.for (int i = list.size() - 1; i >= 0; i--) {
if ("java".equals(list.get(i))) {
list.remove(i);
i= i+1 ;
}
}

B.for (int i = 0; i < list.size(); i++) {
if ("jav……

[解决办法]
探讨
A数组会越界,B不会,所以A可以B不行

[解决办法]
探讨

引用:
B : list.remove(i);后面加上i--

看好他的i是定义在 for后面的括号里,i--木有用的,=_=!

[解决办法]
啊啊啊啊 我太粗心了,,悲剧
第一种写法是正确的 ,其实看了这个题,以后又知道一种删除List元素不用去管越界问题的写法了,杂以前没想到呢,童鞋些有这种感觉吗
[解决办法]
list集合自动前移的问题:
list集合中删除前一元素,后边的元素会自动前移,即原来5个元素,删除后就只有0-4位置的元素了,这样肯定出现问题。所以删除元素从后到前。
[解决办法]

Java code

A.for (int i = list.size() - 1; i >= 0; i--) {  if ("java".equals(list.get(i))) {  list.remove(i);  }  }B.for (int i = 0; i < list.size(); i++) {  if ("java".equals(list.get(i))) {  list.remove(i);i--;  }  }C.for(Iterator it = list.iterator();it.hasNext;){  if ("java".equals(it.next) {     it.remove();  }}
[解决办法]
主要原因在于,ArrayList.size()这个方法得到是集合中的元素个数,而不像数组中的length属性中得到的是数组的长度,前者是随着集合内的元素增删而改变的,后而后者是不变得。这两个概念不要混淆。

下面说一下你的困惑:

为什么B不行的,看一下B的代码:分析一下;for (int i = 0; i < list.size(); i++) 这句代码中,中间这句,就是循环的判断条件,i<List.size();根据上面的原理,这个i值是变化的。根据程序走一遍。

1.for循环刚开始,i初始化等于0;而这是的集合中有六个元素,所以list.size()等于6,符合条件,执行了循环体。接着i++

2.进过上面的i++,这i等于1了,而这是list.size()因为删除了一个元素,所以等于5个,也符合i< list.size()这个条件,所以又执行的循环体,i再次++;


3.当i自增到4的时候,因为经过循环体的四次循环后,集合中只剩下了2个元素(java,bbb),list.size()等于2而小于i,因为程序的循环条件不成立而退出的循环,但是这时候集合中还有一个java还没有删除。故这种方法不可行,A为什么可以,你自己按照这个理论推一下。
[解决办法]
探讨

B : list.remove(i);后面加上i--

[解决办法]
这个List的结构有关,你如果删除掉一个元素,这个元素后面的元素相应的index会减1,可以理解成集体前移一步,所有从头遍历的时候,如果你删除数据了,就必须2楼说的那样循环-1,否则会漏掉一个元素没有遍历,另外不会出现越界,因为list.size删除掉 时候也跟着变化了。
[解决办法]
探讨
引用:

引用:
B : list.remove(i);后面加上i--

看好他的i是定义在 for后面的括号里,i--木有用的,=_=!
不知道别再乱说 我汗

[解决办法]
探讨
引用:

引用:
B : list.remove(i);后面加上i--

看好他的i是定义在 for后面的括号里,i--木有用的,=_=!
不知道别再乱说 我汗

[解决办法]
Java code
 for (int i = list.indexOf("java"); i>=0; i = list.indexOf("java")) {list.remove(i);} 

读书人网 >J2SE开发

热点推荐