List中移除指定元素
例一:
想在list中删除元素,先看下面的这一段代码:
public class App2 { public static void main( String[] args ){ List<String> list = new ArrayList<String>(); list.add("aa"); list.add("bb"); list.add("cc"); list.add("dd"); for(int i=0;i<list.size();i++) { if("bb".equals(list.get(i))) { list.remove(i); } } for(String s:list) { System.out.println(s); } } }
运行结果
aa
cc
dd
看起来没啥问题,再看下面的例子。
例二:
此时,list中有多个重复的元素,我们还是用原来的方法进行去重,如下所示:
public class App2 { public static void main( String[] args ){ List<String> list = new ArrayList<String>(); list.add("aa"); list.add("bb"); list.add("bb"); list.add("cc"); list.add("dd"); list.add("bb"); for(int i=0;i<list.size();i++) { if("bb".equals(list.get(i))) { list.remove(i); } } for(String s:list) { System.out.println(s); } } }
运行结果
aa
bb
cc
dd
貌似出了个小问题,因为有个bb并没有去除掉。
原因:
为什么会出现这种问题呢?当删除第一个bb元素后,下一个元素就会向前移一位 , 而for循环的索引是继续往后加1的,即没删除之前list.get(2)='bb',当删除第一个“bb”后,下一个元素前移,导致此时list.get(1)='bb',list.get(2)='cc',而for循环里面的i并没有发生变化,还是继续执行+1向后遍历的操作,导致“bb”元素逃脱了并没有删除。
解决方式一:
只需要在发生删除元素的时候,将索引里面的i向前移位即可,即元素发生前移的同时,也让索引发生前移,即i--,如下代码所示:
public class App2 { public static void main( String[] args ){ List<String> list = new ArrayList<String>(); list.add("aa"); list.add("bb"); list.add("bb"); list.add("cc"); list.add("dd"); list.add("bb"); for(int i=0;i<list.size();i++) { if("bb".equals(list.get(i))) { list.remove(i); i--; } } for(String s:list) { System.out.println(s); } } }
输出结果如下所示:
aa
cc
dd
解决方式二:
使用倒序遍历list,如下所示:
public class App2 { public static void main( String[] args ){ List<String> list = new ArrayList<String>(); list.add("aa"); list.add("bb"); list.add("bb"); list.add("cc"); list.add("dd"); list.add("bb"); for(int i=list.size()-1;i>=0;i--) { if("bb".equals(list.get(i))) { list.remove(i); } } for(String s:list) { System.out.println(s); } } }
输出结果如下:
aa
cc
dd
解决方式三:
使用迭代器Iterator来进行元素操作(官方推荐),代码如下所示:
public class App2 { public static void main( String[] args ){ List<String> list = new ArrayList<String>(); list.add("aa"); list.add("bb"); list.add("bb"); list.add("cc"); list.add("dd"); list.add("bb"); Iterator<String> it = list.iterator(); while(it.hasNext()) { if("bb".equals(it.next())) { it.remove(); } } for(String s:list) { System.out.println(s); } } }
输出结果如下所示:
aa
cc
dd
解决方式四:
使用java8的lambda表达式,使用lambda表达式的方法更为优雅,这里使用了List接口所继承的Collection接口在JDK 1.8新增的removeIf方法,该方法接收一个Predicate类型的参数,删除列表中满足Predicate条件的元素。
public class App2 { public static void main( String[] args ){ List<String> list = new ArrayList<String>(); list.add("aa"); list.add("bb"); list.add("bb"); list.add("cc"); list.add("dd"); list.add("bb"); list.removeIf(e ->"bb".equals(e)); for(String s:list) { System.out.println(s); } } }
输出结果如下:
aa
cc
dd
原文链接:https://blog.csdn.net/xhf852963/article/details/113997328