List 循环删除方法
程序员文章站
2022-05-09 18:35:22
...
如果要循环删除List中的某些元素,例如删除值都是‘a’的元素,如果使用普通的for循环,很容易就会会漏删或者报错。
package com.pdnev; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import org.junit.Before; import org.junit.Test; public class RemoveList { List<String> list; //准备数据 @Before public void setData(){ list = new ArrayList<String>(); list.add("a");list.add("b");list.add("c");list.add("a");list.add("b");list.add("b");list.add("d");list.add("c");list.add("c");list.add("d");list.add("c"); } //测试正确的方法 @Test public void removeElement(){ System.out.println("原始数据: "+ Arrays.asList(list)); //从后向前删除 for(int i = list.size()-1;i>=0;i--){ if(list.get(i).equals("a")) list.remove(i); } System.out.println("删除a后: "+ Arrays.asList(list)); //Iterator 删除 Iterator<String> it = list.iterator(); while(it.hasNext()){ String s = it.next(); if(s.equals("b")) it.remove(); //不可以使用list.remove } System.out.println("删除b后: "+ Arrays.asList(list)); //会漏掉的删除 for(int i = 0;i<list.size();i++){ if(list.get(i).equals("c")) list.remove(i); } System.out.println("删除c后: "+ Arrays.asList(list)); int size = list.size(); for(int i = 0;i<size;i++){ if(list.get(i).equals("d")) list.remove(i); } } }
执行结果:
可以看到,第一种使用从后向前删除是没有问题的。第二种使用Iterator 删除也是没问题的。
但是删除c 这一行的输出就有问题,仍然有c。 这是使用普通的for循环删除,会漏删,另外,如果size不是每次都去获取,会报越界异常。
如果使用 增强for的时候。会报ConcurrentModificationException异常
(因为对junit不熟悉,所以代码使用了junit练习下)