当前位置: 首页 > news >正文

面试题: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();}

a48a73a5ab7240918265804b4db6d833.png

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();}

5fbcc2bc06d84fa98e35c4c7238e038b.png

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. keySetSystem.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.EntrySystem.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 APISystem.out.println("stream API 遍历");map.entrySet().stream().forEach((entry -> System.out.print(entry.getKey() + "=" + entry.getValue() + " ")));System.out.println();}

2ceaa64a9e2449cc83fdc4c1f361e5ef.png

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

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();}

01d191e89ab545ed8b235e95ffd14051.png

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);}

54f6d4029a034ec59c7e854080c1652d.png

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);}

aba7ce1a24ae4917a22237836f7f8333.png

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 电子电气架构 --- 基于AUTOSAR方法论的诊断开发流程
  • 02、MySQL-DML(数据操作语言)
  • k8s 四种Service类型(ClusterIP、NodePort、LoadBalancer、ExternalName)详解
  • 【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
  • 如何高效管理餐厅?餐厅收银系统轻松解决!
  • pgbackrest备份方案(差异和增量备份的区别)
  • 如何在SpringBoot中进行单元测试?
  • Visual Studio Code搭建VUE开发环境
  • 【linux】curl命令用法
  • 敏捷开发模式优缺点,对测试人员有哪些要求?
  • python常用标准库
  • Leetcode75-7 除自身以外数组的乘积
  • VUE3—无限级菜单渲染
  • C++ 异步编程脉络与示例
  • web基础与HTTP
  • CSS魔法堂:Absolute Positioning就这个样
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 翻译:Hystrix - How To Use
  • 两列自适应布局方案整理
  • 深入浅出Node.js
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​iOS安全加固方法及实现
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​secrets --- 生成管理密码的安全随机数​
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #pragma once
  • #微信小程序:微信小程序常见的配置传旨
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (CPU/GPU)粒子继承贴图颜色发射
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)计算机毕业设计ssm电影分享网站
  • (论文阅读11/100)Fast R-CNN
  • (十) 初识 Docker file
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (转)iOS字体
  • (转)菜鸟学数据库(三)——存储过程
  • (转)原始图像数据和PDF中的图像数据
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .net core 连接数据库,通过数据库生成Modell
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET Micro Framework初体验(二)
  • .net Signalr 使用笔记
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET/C#⾯试题汇总系列:⾯向对象
  • .NET4.0并行计算技术基础(1)
  • .net8.0与halcon编程环境构建
  • .NetCore 如何动态路由
  • .NET连接数据库方式
  • .NET是什么