当前位置:   article > 正文

面试题:Java 集合类的遍历方式,如何一边遍历 一边删除?

面试题:Java 集合类的遍历方式,如何一边遍历 一边删除?

问题一:你用过 Java 中的哪些集合类?

ArrayList, LinkedList, HashMap, HashSet, TreeSet, Stack, Queue, PriorityQueue等

问题二:集合中遍历元素的方式?

Collection 接口实现子类

1. List 集合

  1. // list 集合
  2. public static void traversalList() {
  3. List<Integer> list = List.of(3, 5, 4, 9, 6);
  4. // 1. for 循环遍历
  5. System.out.println("传统 for循环遍历");
  6. for (int i = 0; i < list.size(); i++) {
  7. System.out.print(list.get(i) + " ");
  8. }
  9. System.out.println();
  10. // 2. foreach 循环遍历
  11. System.out.println("增强 for循环遍历");
  12. for (Integer i : list) {
  13. System.out.print(i + " ");
  14. }
  15. System.out.println();
  16. // 3. 迭代器遍历
  17. System.out.println("迭代器 iterator遍历");
  18. Iterator<Integer> iterator = list.iterator();
  19. while (iterator.hasNext()){
  20. Integer i = iterator.next();
  21. System.out.print(i + " ");
  22. }
  23. System.out.println();
  24. // 4. forEach 方法遍历
  25. System.out.println("forEach 方法遍历");
  26. list.forEach(i -> System.out.print(i + " "));
  27. System.out.println();
  28. // 5. 使用 stream API 遍历
  29. System.out.println("stream API 遍历");
  30. list.stream().forEach(i -> System.out.print(i + " "));
  31. System.out.println();
  32. }

a48a73a5ab7240918265804b4db6d833.png

2. Set 集合 

Set 集合的遍历方式与 list 集合类似,但是 Set 集合不能使用 传统 for 循环遍历,因为 Set 不具备 get() 方法

  1. // set 集合
  2. public static void traversalSet() {
  3. Set<Integer> set = Set.of(7, 6, 3, 8, 4);
  4. // 1. foreach 循环遍历
  5. System.out.println("增强 for循环遍历");
  6. for (Integer i : set) {
  7. System.out.print(i + " ");
  8. }
  9. System.out.println();
  10. // 2. 迭代器遍历
  11. System.out.println("迭代器 iterator遍历");
  12. Iterator<Integer> iterator = set.iterator();
  13. while (iterator.hasNext()){
  14. Integer i = iterator.next();
  15. System.out.print(i + " ");
  16. }
  17. System.out.println();
  18. // 3. forEach 方法遍历
  19. System.out.println("forEach 方法遍历");
  20. set.forEach(i -> System.out.print(i + " "));
  21. System.out.println();
  22. // 4. 使用 stream API 遍历
  23. System.out.println("stream API 遍历");
  24. set.stream().forEach(i -> System.out.print(i + " "));
  25. System.out.println();
  26. }

5fbcc2bc06d84fa98e35c4c7238e038b.png

Map 接口实现子类

由于 Map 接口并没有直接或间接实现 Iterable 接口,故不能直接使用迭代器遍历,并且 Map 键值对映射关系中,只能由键得到值,不能由值得到键(键是唯一的,值不是),因此使用 keySet() 方法可以遍历键和值,使用 values() 方法只能遍历值

  1. // map 集合
  2. public static void traversalMap(){
  3. Map<String, Integer> map = Map.of("a", 1, "b",
  4. 2, "c", 3, "d", 4);
  5. // 1. keySet
  6. System.out.println("使用 keySet 方法遍历");
  7. for (String key : map.keySet()) {
  8. System.out.print(key + "=" + map.get(key) + " ");
  9. }
  10. System.out.println();
  11. // 2. 使用 values 遍历值
  12. System.out.println("使用 values 方法遍历值");
  13. for (Integer i : map.values()) {
  14. System.out.print(i + " ");
  15. }
  16. System.out.println();
  17. // 3. 使用 Map.Entry
  18. System.out.println("通过 Map.Entry 遍历");
  19. for (Map.Entry<String, Integer> entry : map.entrySet()){
  20. System.out.print(entry.getKey() + "=" + entry.getValue() + " ");
  21. }
  22. System.out.println();
  23. // 4. 使用 forEach 方法
  24. System.out.println("forEach 方法遍历");
  25. map.forEach((key, value) -> System.out.print(key + "=" + value + " "));
  26. System.out.println();
  27. // 5. 使用 Stream API
  28. System.out.println("stream API 遍历");
  29. map.entrySet().stream().forEach(
  30. (entry -> System.out.print(entry.getKey() + "=" + entry.getValue() + " "))
  31. );
  32. System.out.println();
  33. }

2ceaa64a9e2449cc83fdc4c1f361e5ef.png

问题三:如何做到一边遍历元素一边删除元素?

1. List 集合

  1. // list 集合
  2. public static void TraversalAndRemoveList(){
  3. Integer[] arr = new Integer[]{3, 5, 4, 9, 6};
  4. // 此处将一个数组变为一个可变的 list 集合
  5. List<Integer> list = Arrays.stream(arr).collect(Collectors.toList());
  6. // 1. 传统 for循环 倒序遍历
  7. System.out.println("通过传统 for 循环倒序遍历并删除");
  8. for (int i = list.size()-1; i >= 0 ; i--) {
  9. if(list.get(i) % 2 == 0){
  10. list.remove(i);
  11. }
  12. }
  13. // 打印
  14. for (int i = 0; i < list.size(); i++) {
  15. System.out.print(list.get(i) + " ");
  16. }
  17. System.out.println();
  18. // 2. 通过迭代器中的 remove 方法
  19. System.out.println("通过迭代器中的 remove 方法遍历并删除");
  20. list = Arrays.stream(arr).collect(Collectors.toList());
  21. Iterator<Integer> iterator = list.iterator();
  22. while (iterator.hasNext()){
  23. if (iterator.next() % 2 == 0){
  24. iterator.remove();
  25. }
  26. }
  27. iterator = list.iterator();
  28. while (iterator.hasNext()){
  29. System.out.print(iterator.next() + " ");
  30. }
  31. System.out.println();
  32. // 3. 使用 List 提供的 removeIf 方法
  33. System.out.println("通过 List 中的 removeIf 方法遍历并删除");
  34. list = Arrays.stream(arr).collect(Collectors.toList());
  35. list.removeIf(number -> number % 2 == 0);
  36. list.forEach(number -> System.out.print(number + " "));
  37. System.out.println();
  38. }

01d191e89ab545ed8b235e95ffd14051.png

2. Set 集合 

  1. // Set 集合
  2. public static void TraversalAndRemoveSet(){
  3. Integer[] arr = new Integer[]{7, 6, 3, 8, 4};
  4. Set<Integer> set = Arrays.stream(arr).collect(Collectors.toSet());
  5. // 1. 使用 Iterator 的 remove 方法
  6. System.out.println("使用 Iterator 的 remove 方法");
  7. Iterator<Integer> iterator = set.iterator();
  8. while (iterator.hasNext()){
  9. if (iterator.next() % 2 == 0){
  10. iterator.remove();
  11. }
  12. }
  13. System.out.println(set);
  14. // 2. 使用 Set 的 removeIf 方法
  15. System.out.println("使用 Set 提供的 removeIf 方法");
  16. set.removeIf(number -> number % 2 == 0);
  17. System.out.println(set);
  18. // 3. 使用 Stream API 不改变原集合, 生成一个新集合
  19. System.out.println("使用 Stream API 生成一个不包含指定元素的新集合");
  20. set = set.stream()
  21. .filter(number -> number % 2 != 0)
  22. .collect(Collectors.toSet());
  23. System.out.println(set);
  24. }

54f6d4029a034ec59c7e854080c1652d.png

3. Map 集合 

Map 集合的遍历删除方式的思路是通过 entrySet() 方法把 Map 中的每个 entry 节点存放在 Set 集合中,再通过 Set 集合的遍历删除方式进行;

  1. // Map 集合
  2. public static void TraversalAndRemoveMap(){
  3. // 删除所有值为偶数的元素
  4. Map<String, Integer> map = new HashMap<>();
  5. map.put("a", 1);
  6. map.put("b", 2);
  7. map.put("c", 3);
  8. map.put("d", 4);
  9. // 1. 通过 entrySet 方法转化为 Set, 使用 iterator 的 remove 方法
  10. System.out.println("转化为 Set 后, 使用 iterator 的 remove 方法");
  11. Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
  12. while (iterator.hasNext()){
  13. if(iterator.next().getValue() % 2 == 0){
  14. iterator.remove();
  15. }
  16. }
  17. System.out.println(map);
  18. // 2. 通过 entrySet 方法转化为 Set, 使用 removeIf 方法
  19. System.out.println("转化为 Set 后, 使用 removeIf 方法");
  20. map.entrySet().removeIf(entry -> entry.getValue() % 2 == 0);
  21. System.out.println(map);
  22. // 3. 使用 Stream API 生成一个不包含指定元素的新集合
  23. System.out.println("转化为 Set 后, 使用 Stream API");
  24. map = map.entrySet().stream()
  25. .filter(entry -> entry.getValue() % 2 != 0)
  26. .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
  27. System.out.println(map);
  28. }

aba7ce1a24ae4917a22237836f7f8333.png

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号