import java.util.ArrayList;
import java.util.List;
public class TestRemove {
public static void main(String[] args) {
List<Integer> i = new ArrayList<Integer>();
i.add(1);
i.add(2);
i.add(3);
i.add(4);
i.add(5);
i.add(6);

i.add(7);i.add(8);
i.add(9);
i.add(10);
i.add(11);

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

}

}这打印结果居然不是0,为什么啊

解决方案 »

  1.   

    当ii=10的时候list里面根本没有第11个元素了。
    for(int ii=i.size();ii>0;) {
    i.remove(--ii);
    }
      

  2.   

    import java.util.ArrayList;
    import java.util.List;
    public class TestRemove {
    public static void main(String[] args) {
    List<Integer> i = new ArrayList<Integer>();
    i.add(1);
    i.add(2);
    i.add(3);
    i.add(4);
    i.add(5);
    i.add(6);i.add(7);i.add(8);
    i.add(9);
    i.add(10);
    i.add(11);
    System.out.println(i.size());//这是删除之前的该集合的大小;
    for(int ii=0;ii<i.size();ii++) {
    i.remove(ii);
    System.out.println(i.size())//这是删除每一个之后的集合的大小;
    }
    System.out.println(i.size())//这是删除完毕之后打印的结果}}
    输出结果为:
    11
    10
    9
    8
    7
    6
    5
    5
    for循环的运行过程为:
    当ii=0,结果为:10;
    当ii=1,结果为:9;
    当ii=2,结果为:8;
    当ii=3,结果为:7;
    当ii=4,结果为:6;
    当ii=5,结果为:5;
    当ii=6,i.size()=4而ii>i.size()不符合for循环的条件就退出for循环所以不再循环了;
      

  3.   

    ii有变大的吹势,i.size有变小的吹势,当ii>i.size时循环退出,退出时很容易的估计得到i.size和ii的情况啊
      

  4.   

    正确的操作应该是这样
    List<Integer> i = new ArrayList<Integer>();
    i.add(1);
    i.add(2);
    i.add(3);
    i.add(4);
    i.add(5);
    i.add(6);
    i.add(7);
    i.add(8);
    i.add(9);
    i.add(10);
    i.add(11);
    System.out.println(i.size());// 这是删除之前的该集合的大小;
    List<Integer> deleteList = new ArrayList<Integer>();
    for (int ii = 0; ii < i.size(); ii++) {
    deleteList.add(i.get(ii));
    }
    i.removeAll(deleteList); //这才是正确的删除方式
    System.out.println(i.size());// 这是删除完毕之后打印的结果LZ 调用ArrayList的
     public E remove(int index) {
    RangeCheck(index); modCount++;
    E oldValue = elementData[index]; int numMoved = size - index - 1;
    if (numMoved > 0)
        System.arraycopy(elementData, index+1, elementData, index,
         numMoved);
    elementData[--size] = null;  return oldValue;
        }
    数组的长度在不断变小,循环的次数相应减小,不能清空数组中对象引用
      

  5.   

    第一次,ii<11, remove一个, 然后ii变成1, size被remove掉一个变成10, 然后判断ii<10成立, ii=2, size=9, ii<9, ii=3, size=8, ii<8, ii=4, size=7, ii<7, ii=5, size=6, ii<6, ii=6, size=5, 然后ii就不小于5了, 循环结束了, 最后size是5
      

  6.   


    没有这么移除的,如果直接操作List应该从最后一个元素开始remove;标准的做法是通过List的Iterator进行集合操作。
      

  7.   

    同意6楼的:
    for(int ii=i.size()-1;i>=0;i--){
      i.remove(ii);
    }
    System.out.println(i);
    输出的结果是:[]
      

  8.   

    你remove的时候,引用会从第一个指向下一个,然后进行ii++了,这样其实是指向原数据的第三个元素【3】了,接下来的remove操作都这样。把【3】删除了,然后指向【5】
    for(int ii=0;ii<i.size();ii++) {
    i.remove(ii);
    ii--;
    }
    这样应该就可以了
    这样就可以了,
      

  9.   

    size 进行--操作,ii++操作,怎么可能把list中的东西都remove掉。
    ii就不要进行++操作,直接循环remove
      

  10.   

    每循环一次,II和LIST的长度都在改变。
      

  11.   

    你每次都打印一下size()方法数值和ii的值就知道为什么了
    性能优化一下:
    List<Integer> i = new ArrayList<Integer>();
    i.add(1);
    i.add(2);
    i.add(3);
    i.add(4);
    i.add(5);
    i.add(6);i.add(7);i.add(8);
    i.add(9);
    i.add(10);
    i.add(11);for(int ii=0,len=i.size();ii<len;ii++) {
    i.remove(ii);
    }
    System.out.println(i.size());
      

  12.   

    size()方法数值和ii的值不同统一
      

  13.   

    第一次删除的时候是删的索引为0的那个元素,删了之后里面的内容会自动靠前,第二次删1那个索引的元素实际就是删的原来索引为2的那个了。
    删列表的数据有很多种,但是用迭代器删除的时候要注意。只能用迭代器的remove方法,其他的都会得到一个ConcurrentModificationException。for(;list.size()>0;)
    {
    list.remove(0);
    }
    ````````````````````````````
    Iterator it = list.listIterator();
    while(it.hasNext())
    {
    it.next();
    it.remove();
    }
      

  14.   

    呃~前面的大牛们都说那么多了,我都不好意思再批评你
    for(int ii=0;ii<i.size();ii++) {
    i.remove(ii);
    }
    这样的写法缺点多多啊
    1、循环边界最好不要变化,这样容易造成死循环而且循环边界不容易控制
    2、计算最好不要放到循环条件里面,而且是每次循环都要执行一次的,这样就浪费了性能
    要么改成这样,每次删第一个
    int size = i.size();
    for(int ii=0;ii<size;ii++) {
    i.remove(0);
    }
    要么就按6楼的,从后面开始删,或者用迭代器
      

  15.   

    遍历list的时候删除元素 比较容易出问题
      

  16.   

    删除的时候应该从最后一个开始删除,因为当你册除后,数组的长度变小了而下标却变大了
    ,所以就删不掉了。  最后用java自带的要好点
      

  17.   

    首先赋值是从1开始的
    删除是从0开始的其次,ii增加了,每remove一次,数组的长度变小了改正方法见楼上
      

  18.   

    size是会变滴!
    改成这样
    Iterator it = list.iterator();
    while(it.hasnext()){
    it.next();
    it.remove();
    }
      

  19.   

    楼主应该用while循环
    import java.util.ArrayList;
    import java.util.List;public class TestRemove{
    public static void main(String[] args) {
    List<Integer> i=new ArrayList<Integer>();  //尖括号泛型
    i.add(1);
    i.add(2);
    while(i.size()!=0){
    i.remove(0);
    }
    System.out.println(i.size());
    }
    }
    这样就对了。
      

  20.   

    检查一下逻辑吧,逻辑上有错误的。list的下标和ii是否对应呢?仔细看一下,相信你会明白这个程序的错误的。come on 
      

  21.   

    你在做remove操作的时候,会将当前元素移除,同时序号后一位的元素序号前移。因此在下一次循环的时候就会漏过一个元素。由你的例子可得:
    ii=0 i[0]=1 被移除,后边所有元素序号减1。此时i[0]=2
    ii=1 i[1]=3 被移除,后边所有元素序号减1。此时i[1]=5
    以此类推,并且移除过程中,i.length会每次减1。
    元素值为 1、3、5、7、9、11的元素被移除,漏过的为2、4、6、8、10
    因此最后打印出来的结果为5。
    给分吧