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

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

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

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

Collection 接口实现子类

1. List 集合

// list 集合
    public static void traversalList() {
        List<Integer> list = List.of(3, 5, 4, 9, 6);

        // 1. for 循环遍历
        System.out.println("传统 for循环遍历");
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i) + " ");
        }
        System.out.println();

        // 2. foreach 循环遍历
        System.out.println("增强 for循环遍历");
        for (Integer i : list) {
            System.out.print(i + " ");
        }
        System.out.println();

        // 3. 迭代器遍历
        System.out.println("迭代器 iterator遍历");
        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()){
            Integer i = iterator.next();
            System.out.print(i + " ");
        }
        System.out.println();

        // 4. forEach 方法遍历
        System.out.println("forEach 方法遍历");
        list.forEach(i -> System.out.print(i + " "));
        System.out.println();

        // 5. 使用 stream API 遍历
        System.out.println("stream API 遍历");
        list.stream().forEach(i -> System.out.print(i + " "));
        System.out.println();
    }

2. Set 集合 

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

// set 集合
    public static void traversalSet() {
        Set<Integer> set = Set.of(7, 6, 3, 8, 4);
        // 1. foreach 循环遍历
        System.out.println("增强 for循环遍历");
        for (Integer i : set) {
            System.out.print(i + " ");
        }
        System.out.println();

        // 2. 迭代器遍历
        System.out.println("迭代器 iterator遍历");
        Iterator<Integer> iterator = set.iterator();
        while (iterator.hasNext()){
            Integer i = iterator.next();
            System.out.print(i + " ");
        }
        System.out.println();

        // 3. forEach 方法遍历
        System.out.println("forEach 方法遍历");
        set.forEach(i -> System.out.print(i + " "));
        System.out.println();

        // 4. 使用 stream API 遍历
        System.out.println("stream API 遍历");
        set.stream().forEach(i -> System.out.print(i + " "));
        System.out.println();
    }

Map 接口实现子类

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

// map 集合
    public static void traversalMap(){
        Map<String, Integer> map = Map.of("a", 1, "b",
                2, "c", 3, "d", 4);

        // 1. keySet
        System.out.println("使用 keySet 方法遍历");
        for (String key : map.keySet()) {
            System.out.print(key + "=" + map.get(key) + " ");
        }
        System.out.println();

        // 2. 使用 values 遍历值
        System.out.println("使用 values 方法遍历值");
        for (Integer i : map.values()) {
            System.out.print(i + " ");
        }
        System.out.println();

        // 3. 使用 Map.Entry
        System.out.println("通过 Map.Entry 遍历");
        for (Map.Entry<String, Integer> entry : map.entrySet()){
            System.out.print(entry.getKey() + "=" + entry.getValue() + " ");
        }
        System.out.println();

        // 4. 使用 forEach 方法
        System.out.println("forEach 方法遍历");
        map.forEach((key, value) -> System.out.print(key + "=" + value + " "));
        System.out.println();

        // 5. 使用 Stream API
        System.out.println("stream API 遍历");
        map.entrySet().stream().forEach(
                (entry -> System.out.print(entry.getKey() + "=" + entry.getValue() + " "))
        );
        System.out.println();
    }

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

1. List 集合

// list 集合
    public static void TraversalAndRemoveList(){
        Integer[] arr = new Integer[]{3, 5, 4, 9, 6};
        // 此处将一个数组变为一个可变的 list 集合
        List<Integer> list = Arrays.stream(arr).collect(Collectors.toList());

        // 1. 传统 for循环 倒序遍历
        System.out.println("通过传统 for 循环倒序遍历并删除");
        for (int i = list.size()-1; i >= 0 ; i--) {
            if(list.get(i) % 2 == 0){
                list.remove(i);
            }
        }
        // 打印
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i) + " ");
        }
        System.out.println();

        // 2. 通过迭代器中的 remove 方法
        System.out.println("通过迭代器中的 remove 方法遍历并删除");
        list = Arrays.stream(arr).collect(Collectors.toList());
        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()){
            if (iterator.next() % 2 == 0){
                iterator.remove();
            }
        }

        iterator = list.iterator();
        while (iterator.hasNext()){
            System.out.print(iterator.next() + " ");
        }
        System.out.println();

        // 3. 使用 List 提供的 removeIf 方法
        System.out.println("通过 List 中的 removeIf 方法遍历并删除");
        list = Arrays.stream(arr).collect(Collectors.toList());
        list.removeIf(number -> number % 2 == 0);
        list.forEach(number -> System.out.print(number + " "));
        System.out.println();
    }

2. Set 集合 

// Set 集合
    public static void TraversalAndRemoveSet(){
        Integer[] arr = new Integer[]{7, 6, 3, 8, 4};
        Set<Integer> set = Arrays.stream(arr).collect(Collectors.toSet());

        // 1. 使用 Iterator 的 remove 方法
        System.out.println("使用 Iterator 的 remove 方法");
        Iterator<Integer> iterator = set.iterator();
        while (iterator.hasNext()){
            if (iterator.next() % 2 == 0){
                iterator.remove();
            }
        }
        System.out.println(set);

        // 2. 使用 Set 的 removeIf 方法
        System.out.println("使用 Set 提供的 removeIf 方法");
        set.removeIf(number -> number % 2 == 0);
        System.out.println(set);

        // 3. 使用 Stream API 不改变原集合, 生成一个新集合
        System.out.println("使用 Stream API 生成一个不包含指定元素的新集合");
        set = set.stream()
                .filter(number -> number % 2 != 0)
                .collect(Collectors.toSet());
        System.out.println(set);
    }

3. Map 集合 

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

// Map 集合
    public static void TraversalAndRemoveMap(){
        // 删除所有值为偶数的元素
        Map<String, Integer> map = new HashMap<>();
        map.put("a", 1);
        map.put("b", 2);
        map.put("c", 3);
        map.put("d", 4);


        // 1. 通过 entrySet 方法转化为 Set, 使用 iterator 的 remove 方法
        System.out.println("转化为 Set 后, 使用 iterator 的 remove 方法");
        Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()){
            if(iterator.next().getValue() % 2 == 0){
                iterator.remove();
            }
        }
        System.out.println(map);


        // 2. 通过 entrySet 方法转化为 Set, 使用 removeIf 方法
        System.out.println("转化为 Set 后, 使用 removeIf 方法");
        map.entrySet().removeIf(entry -> entry.getValue() % 2 == 0);
        System.out.println(map);


        // 3. 使用 Stream API 生成一个不包含指定元素的新集合
        System.out.println("转化为 Set 后, 使用 Stream API");
        map = map.entrySet().stream()
                .filter(entry -> entry.getValue() % 2 != 0)
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
        System.out.println(map);
    }

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java中,可以使用Stream流来遍历集合类。首先,需要将集合类转换为流对象,然后可以使用流的各种操作来遍历和处理元素。引用展示了一个使用Stream流遍历集合的示例代码。在这个例子中,通过调用Stream的of方法创建了一个包含字符串元素的流对象。然后,可以使用collect方法将流对象收集到不同类型的集合中。例如,可以使用Collectors.toList()方法将流对象收集到List集合中,使用Collectors.toSet()方法将流对象收集到Set集合中。引用展示了这些方法的具体使用。 另外,对于已有的集合对象,也可以通过调用集合类的stream()方法来获取相应的流对象。例如,可以使用Map集合的keySet()方法获取键的流对象,然后进行遍历和处理。引用展示了如何通过keySet().stream()方法获取Map集合键的流对象。 综上所述,要使用Java集合类的Stream流进行遍历,首先需要将集合对象转换为流对象,然后可以使用流的各种操作方法来处理和遍历元素。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [java8新特性之Steam(告别繁琐的循环遍历)](https://blog.csdn.net/wanghaiping1993/article/details/125284521)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rcnhtin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值