当前位置:   article > 正文

【Java语言】遍历List元素时删除集合中的元素_java list 递归时移除元素

java list 递归时移除元素

目录

前言

实现方式

1.普通实现

1.1 使用【for循环】 方式

1.2 使用【迭代器】方式

2.jdk1.8新增功能实现

2.1 使用【lambda表达式】方式

2.2 使用【stream流】方式

注意事项

1. 使用【for循环】 方式

2. 不能使用增强for遍历修改元素

总结


前言

        分享几种从List中移除元素的常用方法,【注意事项】尤其重要,很容易踩坑。


实现方式

场景:移除List集合中所有的偶数。 

1.普通实现

1.1 使用【for循环】 方式

  • 代码示例如下:
  1. /**
  2. * 使用【for循环】在遍历过程中移除元素
  3. * @param list
  4. * @return
  5. */
  6. public static List<Integer> removeMethod6(List<Integer> list) {
  7. for (int i = list.size() - 1; i >= 0; i--) {
  8. Integer integer = list.get(i);
  9. if (0 == integer % 2) {
  10. list.remove(i);
  11. }
  12. }
  13. return list;
  14. }

1.2 使用【迭代器】方式

  • while循环】代码示例如下:
  1. /**
  2. * 使用迭代器在遍历过程中移除元素
  3. * @param list
  4. * @return
  5. */
  6. public static List<Integer> removeMethod(List<Integer> list) {
  7. Iterator<Integer> iterator = list.iterator();
  8. while (iterator.hasNext()) {
  9. Integer integer = iterator.next();
  10. if (0 == integer % 2) {
  11. iterator.remove();
  12. }
  13. }
  14. return list;
  15. }
  • for循环】代码示例如下:
  1. /**
  2. * 使用【增强for】在遍历过程中移除元素
  3. * @param list
  4. * @return
  5. */
  6. public static List<Integer> removeMethod2(List<Integer> list) {
  7. for (Iterator iterator = list.iterator(); iterator.hasNext();) {
  8. Integer integer = (Integer) iterator.next();
  9. if (0 == integer % 2) {
  10. iterator.remove();
  11. }
  12. }
  13. return list;
  14. }

2.jdk1.8新增功能实现

2.1 使用【lambda表达式】方式

  • 代码示例如下:
  1. /**
  2. * 使用【lambda表达式】移除元素
  3. * @param list
  4. * @return
  5. */
  6. public static List<Integer> removeMethod3(List<Integer> list) {
  7. list.removeIf(integer -> 0 == integer % 2);
  8. return list;
  9. }

2.2 使用【stream流】方式

  • 代码示例如下: 
  1. /**
  2. * 使用【stream流】移除元素
  3. * @param list
  4. * @return
  5. */
  6. public static List<Integer> removeMethod4(List<Integer> list) {
  7. list = list.stream().filter(integer -> 0 == integer % 2).collect(Collectors.toList());
  8. return list;
  9. }

注意事项

1. 使用【for循环】 方式

在1.1中,为什么要从集合的最后往前遍历呢? 

        因为List底层是一个动态数组,从数组中移除一个非末尾的元素,该元素后面的元素都会动态的往前移动。如果从前往后遍历,那每移除一个元素,当前索引的元素就会发生改变,会导致有些元素遍历不到,影响结果的正确性。 例如:

  1. package com.zhy.coll;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. public class TestList {
  5. /**
  6. * 初始化List集合
  7. * @return
  8. */
  9. public static List<Integer> initList(List<Integer> list){
  10. for(int i = 0; i < 10; i++) {
  11. Integer integer = (int)(Math.random() * 100);
  12. list.add(integer);
  13. }
  14. return list;
  15. }
  16. /**
  17. * 使用迭代器在遍历过程中移除元素
  18. * @param list
  19. * @return
  20. */
  21. public static List<Integer> removeMethod5(List<Integer> list) {
  22. for (int i = 0; i < list.size(); i++) {
  23. Integer integer = list.get(i);
  24. if (0 == integer % 2) {
  25. list.remove(i);
  26. }
  27. }
  28. return list;
  29. }
  30. public static void main(String[] args) {
  31. List<Integer> list = new ArrayList<Integer>();
  32. initList(list);
  33. List<Integer> list2 = new ArrayList<Integer>();
  34. list2.addAll(list);
  35. System.out.println("初始化集合:\n\t" + list2);
  36. //方式五
  37. list2.clear();
  38. list2.addAll(list);
  39. System.out.println("使用【for循环】从前往后遍历数组,并移除集合中所有的偶数:\n\t" + removeMethod5(list2));
  40. }
  41. }

输出结果:发现并没有正确移除集合中所有的偶数。

注:所以使用这种方式的话,一定要特别注意,用倒序遍历索引的方式。 

2. 不能使用增强for遍历修改元素

增强for只能遍历集合元素,不能对集合元素个数进行修改(包括增加和删除)会编译报错


总结

        使用普通实现方式,一目了然,但是代码行数比较多;使用1.8新增功能实现,代码就会简洁,但是在团队配合开发的场景中,如果没有了解过1.8新增特性的,可能可读性不强。方式各有优劣势,根据需求择优选择。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/957998
推荐阅读
相关标签
  

闽ICP备14008679号