查找list里面的的某些值(可以重复的),将其删除掉,
以下代码有没有问题,有的话是什么问题,如何解决?没有的话请直接输出结果。import java.util.ArrayList;
import java.util.List;public class TestList {
public static void main(String[] args) {
List<Integer> list=new ArrayList<Integer>();
for(int i=0;i<10;i++){
list.add(i);//组装list
}
for(int i=0;i<list.size();i++){
if(5==(Integer)list.get(i)){//循环查找如果是5的就删除
list.remove(i);
}
}
for(int i=0;i<list.size();i++){
System.out.print(list.get(i));
}
}
}

解决方案 »

  1.   


    for(int i=0;i<list.size();i++){
                if(5==(Integer)list.get(i)){//循环查找如果是5的就删除
                    list.remove(i);
                }
            }删掉一个元素以后,list.size();随之发生了变化,但是i还是继续往上加,所以应该这样:for(int i=0;i<list.size();i++){
                if(5==(Integer)list.get(i)){//循环查找如果是5的就删除
                    list.remove(i);
                  i--;
                }
            }
      

  2.   

    在循环里remove会造成指针位置偏移第二个循环,记下位置,在外面remove
      

  3.   

           for(int i=0;i<list.size();i++){
                if(5==(Integer)list.get(i)){//循环查找如果是5的就删除
                    list.remove(i);
                  i--; //加上这个才行;
                }
            }
      

  4.   

    而且//循环查找如果是5的就删除
    仅仅删除5没必要循环查找直接remove(new Integer(5))好了
      

  5.   

    测试代码如下:
    public static void main(String[] args) {
            List<Integer> list=new ArrayList<Integer>();
            
            for(int i=0;i<10;i++){
                list.add(5);//组装list
            }
            
            for(int i=0;i<list.size();i++){
                System.out.print(list.get(i));
            }
            
            System.out.println();
            
            for(int i=0;i<list.size();i++){
                if(5==(Integer)list.get(i)){//循环查找如果是5的就删除
                    list.remove(i);
                }
            }
            
            for(int i=0;i<list.size();i++){
                System.out.print(list.get(i));
            }
        }
      

  6.   

    如果这个list里面都是5  那么就有问题了 所以要加上i--
      

  7.   


    纯粹是乱说,又不是这样子做的,为什么要i--; int count = list.size();
    for (int i = 0; i <count; i++) {
    if (5 == (Integer) list.get(i)) {//
    list.remove(i);
    }
    }
      

  8.   

    纯粹是乱说,又不是这样子做的,为什么要i--; int count = list.size();
    for (int i = 0; i <count; i++) {
    if (5 == (Integer) list.get(i)) {//
    list.remove(i);
    }
    }
      

  9.   

    从这个程序来看程序应该是能输出0123467895只存在一次.所以只能删除一次.remove(i) 时也只删除了一次.所以i 最后能到8 siz()就成9了.
      

  10.   

    没有问题吧!!测了下输出是012346789。
    在其它地方加数字5结果也没错。同意5楼,SIZE是动态的!
      

  11.   

    你们用我8#的代码测试下就知道区别了 不要没想就瞎说size是动态的怎么了 正因为是动态的 才有问题 如果这个list里面都是5的话 你测试下 有什么问题  按理说应该都被删了 但是不加i--会都删了吗?
      

  12.   

    在第二个循环中加入两个打印语句
            for(int i=0;i<list.size();i++){
             System.out.println("i=="+i);
             System.out.println("list=="+list.get(i));
                if(5==(Integer)list.get(i)){//循环查找如果是5的就删除
                    list.remove(i);
                }
            }结果是
    i==0
    list==0
    i==1
    list==1
    i==2
    list==2
    i==3
    list==3
    i==4
    list==4
    i==5
    list==5
    i==6
    list==7
    i==7
    list==8
    i==8
    list==9
      

  13.   

    可以用以下代码删除list中的元素://把全部的4和5删除:
    list.removeAll(new ArrayList<Integer>(){{add(5);add(4)}});
      

  14.   

    #10和#11自己不懂还瞎说,根本不知道remove方法会发生什么变化.
      

  15.   


    强烈同意
    原因就是因为list动态的  如果全是5的话当你删了第一个5的时候,list会自动把原来第二个5放在第一个位置上 所以如果没加上i--的话,其实只是删除了原来list里面第1,3,5,7,9位置上的数字了
    新的测试代码:        List<Integer> list=new ArrayList<Integer>();
            
            for(int i=0;i<10;i++){
                list.add(i);//组装list
            }
            
            for(int i=0;i<list.size();i++){
                System.out.print(list.get(i));
            }
            
            System.out.println();
            
            for(int i=0;i<list.size();i++){
    /*            if(5==(Integer)list.get(i)){//循环查找如果是5的就删除
                    list.remove(i);
                }*/
             list.remove(i);
            }
            
            for(int i=0;i<list.size();i++){
                System.out.print(list.get(i));
            }
    }结果:
    0123456789
    13579
      

  16.   

    如果用倒过来遍历就可以不用特殊处理i.另外要注意不能用增强for循环.
      

  17.   

    我觉得最好的办法就是记下位置,遍历完后再一一删除。免得size()的变化带来麻烦
      

  18.   

    记下位置再删就不会使size()发生变化?
      

  19.   

    list只要你删了一个元素就list空间就会立马少一个的  而不是等你循环完操作在减少的
      

  20.   

           for(int i=list.size()-1;i>=0;i--){
                if(5==(Integer)list.get(i)){//循环查找如果是5的就删除
                    list.remove(i);
                }
            }
      

  21.   

    还有就是直接加上i-- ,的话程序也是是有点问题的,就是临界值的问题,如果是最后一个是5的话 ,remove掉应该是没有问题的阿
    还有只有一个值的时候能 也是没有问题的。
      

  22.   

    每次的循环条件都是i<list.size(),不知道怎么可以越界.
      

  23.   

    因为你进行了remove后 list的实际长度是(原来长度-1)才对 
    而这个count是不变的