首页 > 代码库 > for循环删除list元素陷阱

for循环删除list元素陷阱

首先我们先看一段代码,如下:

 1 List<String> list=new ArrayList<String>(); 2         list.add("123"); 3         list.add("234"); 4         list.add("134"); 5         list.add("657"); 6         list.add("198"); 7         list.add("654"); 8         for (int i = 0; i < list.size(); i++) 9         {10             String str=list.get(i);11             if(str.contains("1"))12             {13                 //list.remove(i);14                 list.remove(str);15             }16              17         }18             System.out.println(list);   

 

运行结果

结果也是对的,我们现在修改一下list中元素中的值,把第2个元素中加上一个1,代码如下:

List<String> list=new ArrayList<String>();        list.add("123");        list.add("2314");        list.add("134");        list.add("657");        list.add("198");        list.add("654");        for (int i = 0; i < list.size(); i++)        {            String str=list.get(i);            if(str.contains("1"))            {                //list.remove(i);                list.remove(str);            }                     }            System.out.println(list);               }

 

运行结果:

结果不是我们所期望的,那么错在了哪里呢??

在for循环中,当删除第一个元素“123”之后,此时的list元素包括“2314” “134” “657” “198” “654”,再进行下一次循环时i=1,指向的str=“134”,把“2314”给跳了过去,所以不能把包含“2314”的元素删除,只是删除了 list中的元素奇数的包含1的元素

所以我们需要在删除完元素之后将i-1处理

 

 1 List<String> list=new ArrayList<String>(); 2         list.add("123"); 3         list.add("2314"); 4         list.add("134"); 5         list.add("657"); 6         list.add("198"); 7         list.add("654"); 8         for (int i = 0; i < list.size(); i++) 9         {10             String str=list.get(i);11             if(str.contains("1"))12             {13                 //list.remove(i);14                 list.remove(str);15                 i--;16             }17              18         }19             System.out.println(list);  20          21     }

 

for循环删除list元素陷阱