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

news2024/9/27 5:49:22

问题一:你用过 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);
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1988848.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】进程间通信(管道通信、共享内存通信)

一.什么是进程间通信 进程间通信这五个字很好理解&#xff0c;就是进程和进程之间通信。 那么为什么要有进程间通信呢&#xff1f; 1.数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 2.资源共享&#xff1a;多个进程之间共享同样的资源 3.通知事件&#xff1a;一…

如何制作自己的python .whl包(支持entry_points)

目录 代码目录结构如下截图所示&#xff1a;dir_test.py 源码如下&#xff1a;list/dir_list.py 源码如下&#xff1a;setup.py 文件源码生成.whl文件指令&#xff1a; 代码目录结构如下截图所示&#xff1a; dir_test.py 源码如下&#xff1a; import os import sys from pat…

RunAsDate(时间限制工具)

参考链接1 参考链接2 参考链接3 下载地址 ps&#xff1a;64位系统需要下载64的RunAsDate

LAMP架构详解

目录 一、Apache详解 1.1 简介 1.2 Apache功能 1.3 apache特点 1.4 三种工作模式 二、LAMP简介 2.1 LAMP平台概述 2.2 构建LAMP平台顺序 2.3 编译安装的优点 2.4 各组件的主要作用 三、wget命令 四、curl命令 五、压力测试工具 一、Apache详解 1.1 简介 Apache …

vue2,v-for中动态渲染本地的图片

一、描述 如果是正常在img标签的src上使用本地的url地址&#xff0c;是可以正常被渲染的&#xff0c;但是我们通过for的形式&#xff0c;动态渲染的话&#xff0c;就会通过网络请求的方式进行渲染&#xff0c;这个形式反而渲染不出来。 二、效果 这个效果&#xff0c;毋庸置…

LVS负载均衡集群部署之—NAT模式的介绍及搭建步骤

一、环境准备 1.准备三台rhel9服务器 服务器名称 主机名 ip地址备注LVS调度服务器lvs.timinglee.org eth0:172.25.254.100&#xff08;外网&#xff09; eth1:192.168.0.100(内网) 关闭selinux和防火墙webserver2网站服务器webserver1.timinglee.orgeth0&#xff1a;192.168.…

为什么高校开设微专业,建议搭建动作捕捉与数字人开发实训室?

随着近年来虚拟现实技术产业与元宇宙产业不断发展&#xff0c;动作捕捉技术成为元宇宙、VR/AR、影视动画、游戏、艺术创作、虚拟偶像等行业相关不可或缺的技术之一。各大院校为了探索新的教学模式&#xff0c;纷纷积极开设“微专业”&#xff0c;相比传统的虚拟仿真实训室来说&…

Linux进程调度与切换

目录 前言 Linux 2.6内核O(1)调度器 调度过程 调度算法 Linux 进程切换 前言 在Linux 2.6版本的内核中&#xff0c;进程调度器引入了O(1)调度器&#xff0c;这个调度器通过优先级队列、活跃队列和过期队列的机制来管理进程调度,虽然在现在已被更好的CFS调度器取代,但对于我…

中仕公考:2024年空军专业技能类文职人员公开招考公告

2024年空军专业技能类文职人员公开招考公告&#xff0c;有关事项公告如下&#xff1a; 一、招考岗位 主要有保管员、司机、炊事员、文印员、汽车修理工兼司机等专业技能三级以下岗位。 二、招考对象 符合岗位资格条件的社会人员(含高校应届毕业生、退役军人)。 根据军队有…

理解栈(Stack)及其在 C++ 中的应用【栈、数据结构】

在这篇博客中&#xff0c;我们将详细介绍栈&#xff08;Stack&#xff09;这一重要的数据结构&#xff0c;包括其基本概念、常用操作、C 中的实现&#xff0c;以及一些实际应用。 什么是栈&#xff1f; 栈是一种数据结构&#xff0c;它遵循“后进先出”&#xff08;LIFO - La…

上海AI Lab 搭台,36个大模型一起角逐长上下文建模能力

现在的大模型论文简直像是在比长度&#xff0c;动不动就上百页&#xff01;记得前阵子小编瞅见那份90页的Gemini技术报告&#xff0c;顿时脑袋嗡嗡作响。那会儿就幻想着&#xff1a;要是有个AI大脑来啃下这些"学术巨无霸"&#xff0c;那岂不是爽歪歪&#xff1f; 没…

SpringDoc:一个用于自动生成API文档的工具

SpringDoc的使用 概述SpringDoc添加依赖配置 Springdoc创建 REST 控制器访问 API 文档添加注释和描述自定义配置常用注解 详细示例创建模型类创建REST控制器查看Swagger UI与OpenAPI 安全策略类型概述HTTPAPIKEYOAUTH2OPENIDCONNECTMUTUALTLS 请求头配置认证token代码实现验证 …

C++:C++11介绍

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一、C11简介 二 统一的列表初始化 2.1 {} 初始化 2.2 std::initializer_list 三 声明 3.1 auto 3.2 decltype 3.3 nullptr 四 范围for循环 五 智能指针 六 STL中一些变化…

瑞_RabbitMQ_初识MQ

文章目录 1 初识MQ1.1 同步调用1.1.1 同步调用的优势1.1.2 同步调用的缺点 1.2 异步调用1.2.1 异步调用的角色1.2.2 异步调用的优势1.2.3 异步调用的缺点1.2.4 异步调用的场景 1.3 MQ技术选型 2 RabbitMQ2.1 安装2.1.1 资源准备2.1.2 安装步骤 2.2 RabbitMQ架构2.3 RabbitMQ管理…

Starrocks解析json数组

json数据 [{"spec": "70g/支","unit": "支","skuId": "1707823848651276346","amount": 6,"weight": 70,"spuName": "伊利 甄稀 苦咖啡味雪糕 流心冰淇淋 70g/支",&quo…

你不知道,PMP证书的含金量究竟有多高

PMP考试的含金量体现在其全球认可度、对职业发展的助力、薪资潜力的提升、系统的知识体系、持续学习的要求以及专业网络的建设等方面。 尽管存在一定的维护成本和市场饱和度问题&#xff0c;PMP认证仍然是项目管理领域内备受推崇的资格证书。 对于追求专业发展和提升项目管理…

【安卓】发送自定义广播

文章目录 发送标准广播发送有序广播 发送标准广播 先定义一个BroadcastReceiver来准备接收广播&#xff0c;新建一个MyBroadcastReceiver。 public class MyBroadcastReceiver extends BroadcastReceiver {Overridepublic void onReceive(Context context, Intent intent) {To…

惊爆!OpenAI 高层发生剧烈动荡!竟然有 3 名元老同时离职,同时,马斯克竟起诉奥特曼“敲诈勒索”, GPT-5 要推迟了?

当今之 OpenAI 可谓是事端频出&#xff0c;波澜迭起。 开端之际&#xff0c;马斯克竟对 OpenAI提起诉讼&#xff0c;随后&#xff0c;重要的元老级高管公开宣告离职&#xff0c;而且还被披露高管领导层内部动荡不安&#xff0c;最终&#xff0c;就连原本定于年底发布的 GPT-5 …

【JVM基础15】——实践-JVM参数可以在哪里设置

目录 1- 引言&#xff1a;2- ⭐核心&#xff1a;2-1 Tomcat 设置 JVM 参数2-2 Jar包设置 JVM 参数 3- 小结&#xff1a;3-1 JVM参数可以在哪里设置 1- 引言&#xff1a; 一般这种问题是涉及到项目部署时候的参数设置&#xff0c;一般的部署方式 war 包部署在 tomcat 中设置jar…