黑马程序员技术交流社区
标题:
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