为什么 这样移除不掉list里的数据

sl514 2012-06-05 05:25:59
public static void main(String[] args) {
List<String> l = new ArrayList<String>();
l.add("11111");
l.add("22222");

for(String a : l){
l.remove(a);
}

for(int i=0;i<l.size();i++){
l.remove(l.get(i));
}

for(int i=0;i<l.size();i++){
l.remove(i);
}
System.out.println(l.size());
}


这样一个简单的代码 想必大家都知道。
申明一个list 增加2个数据。

中间提供了三种移除方案(运行时 任意选一种)。

最后输出的都是1 而不是0.

我怎么做 才能一个一个移除数据呢;
...全文
234 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
_jerrytiger 2012-06-06
  • 打赏
  • 举报
回复

package com.zf.test;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Test5 {
public static void main(String[] args) {
List<String> l = new ArrayList<String>();
l.add("11111");
l.add("22222");

//单独用下面三个中的某一个方法肯定是都不行的。

//(1) 这里foreach循环,其实就相当于是Iterator在迭代集合对象 ,
// Iterator在迭代对象的时候是不允许被迭代的对象修改或Remove的,除非用Iterator自己的remove()方法
for(String a : l){
l.remove(a);
}
//改成下面这样是可以的。
Iterator<String> it = l.iterator();
while(it.hasNext()){
it.next();
it.remove();
}

//(2) 你可以试想一下 , 刚开始的时候l.size() = 2 , i = 0
// 当执行完第一次循环 就移除了一个对象 此时 , l.size() == 1 , i = 1
// 此时 i< l.size() 不成立 , 就不会继续循环了。
for(int i=0;i<l.size();i++){
l.remove(l.get(i));
}

// 同上
for(int i=0;i<l.size();i++){
l.remove(i);
}
System.out.println(l.size());

}
}

香蕉猪 2012-06-06
  • 打赏
  • 举报
回复
for循环中利用递减方式!!!(int i=l.size();i>=0;i--)......
DaiGangCsdn 2012-06-06
  • 打赏
  • 举报
回复

public static void main(String[] args) {
List<String> l = new ArrayList<String>();
l.add("11111");
l.add("22222");
while(l.size()>0){
l.remove(l.size()-1)
}
System.out.println(l.size());
}


beiouwolf 2012-06-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
List<String> l = new ArrayList<String>();
l.add("11111");
l.add("22222");
while(l.iterator().hasNext()) {
l.remove(l.get(0));
}
System.out.println(l.size());
[/Quote]
汗,这个做法不是每次都获取list.iterator了...
标准的设计溢出啊...
淡定的峰哥 2012-06-06
  • 打赏
  • 举报
回复
打印结果是0 ,如上面所说的,每个for只remove了一个element,第三个for不起作用
游一游走一走 2012-06-06
  • 打赏
  • 举报
回复
for(int i=0;i<l.size();i++){
l.remove(i);
}
当i=0时删除了一个,当i=1时size()=1, 循环退出了
for(int i=0;i<l.size();i++){
l.remove(l.get(i));
}
一个道理

huage 2012-06-06
  • 打赏
  • 举报
回复
其实你已经删除了一个了,size为1 不是2 说明已经删除了一个而已,其它的楼上说的很清楚了
fan_bo0627 2012-06-06
  • 打赏
  • 举报
回复
当你删除了第一个对象后,list内部更新了index,这时list.size=1,而i==1 跳出循环,所以不能完全删除
king_love_eclipse 2012-06-05
  • 打赏
  • 举报
回复
List<String> l = new ArrayList<String>();
l.add("11111");
l.add("22222");
while(l.iterator().hasNext()) {
l.remove(l.get(0));
}
System.out.println(l.size());
beiouwolf 2012-06-05
  • 打赏
  • 举报
回复
遍历删除会产生一个问题
删除动作作用时,会同时改变list内部的index

的确需要遍历删除的情况下,要这么做:

List<String> l = new ArrayList<String>();
l.add("11111");
l.add("22222");

for(Iterator<String> it = l.iterator();it.hasNext();){
it.next();
it.remove();
}

System.out.println(l);


如果你用Iterator接口,要用index来做的话,注意一点,每次删除以后.size()就被改变了,所以你要把size方法移出for循环之外
类似这样:

List<String> l = new ArrayList<String>();
l.add("11111");
l.add("22222");

int size = l.size();
for(int i = size - 1; i >= 0; --i){
l.remove(i);
}

System.out.println(l);

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧