最新要闻
- 全球视讯!特斯拉叫停与比亚迪合作?比亚迪回应:不实信息
- 环球即时:苹果人事巨震:11位高管扎堆离职 库克也要降薪40%
- 微头条丨燃油车 真凉透了吗
- 【天天时快讯】采用全新NT架构:新Windows端QQ首个版本将于24日发布
- 世界资讯:剧版打破多项纪录!爱奇艺考虑拍《狂飙》电影版 网友评论两级分化
- 天天快资讯:免费玩没戏 《暗黑4》不会加入微软XGP:四五百块还是要花的
- 首位华裔奥斯卡影后!杨紫琼84岁母亲喜极而泣 为女儿感到自豪
- 多举措提高职教吸引力 助力职业教育“强起来”“活起来”
- 焦点简讯:曝苹果最快2024年商用MicroLED屏:比OLED更香
- 今日快讯:7月1日普及!我国将全面淘汰传统后视镜 都换汽车电子后视镜:上游供应链已准备好
- 全球今日报丨老人捡钱不愿归还 女孩崩溃下跪引网友愤怒:律师称可起诉 专家喊话不能仗着年龄大
- 环球新动态:适合买二手的硬件只有4个:学会省1000元
- 当前通讯!“自杀式”降价杀红眼:燃油车真凉透了?
- 乘客出地铁黄鹤楼站的统一姿势:集体反站拍摄绝美夜景
- 天天动态:大爷充29万做美容反悔起诉退钱:宣称能打通“任督二脉”等
- 世界聚焦:硅谷银行破产:在营销号那儿 咋又成美国赢了?
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
要闻速递:面试官:怎么删除 HashMap 中的重复元素?第 3 种实现思路,99% 的人不会!
背景
大家好,我是栈长。
前些天,栈长给大家分享了 3 篇实用的文章:
- 带了一个 3 年的开发,不会循环删除 List 中的元素,我简直崩溃!!
- 面试官:怎么去除 List 中的重复元素?我一行代码搞定,赶紧拿去用!
- 面试官:怎么删除 HashMap 中的元素?我一行代码搞定,赶紧拿去用!
List 和 Map 元素的删除、去重,这些都是工作中经常遇到的问题,一些基础程序员可能会走一些弯路,所以栈长输出了三篇,希望对大家有用,其中一些编程技巧很多老程序员也没用过,所以,技术真的是学无止境。
(资料图)
今天栈长带来集合的删除及去重系列的最后一篇,如何删除 HashMap 中的重复元素,即怎么根据 Value去重,去除 HashMap 中 Value 重复的元素,这也是面试官可能会问到的。
为什么不是根据 Key 去重?
大家都知道,HashMap 的 key 是不会重复的,如果有重复就会用新值覆盖旧值。
当我们向一个 HashMap 中插入元素时,HashMap 会根据这个 key 的 equals 和 hashCode 方法进行判断,如果两个 key 的值用 equals 方法比较相同,且 key 的 hashCode 值也相同,那么 HashMap 将认为这是同一个 key,后续插入相同 key 的键值对会将旧值替换为新值。
需要注意的是:
Java 中的基本数据类型和 String 等内置类,它们已经正确实现了 equals 和 hashCode 方法,可以直接用作 HashMap 的 key,而不会导致重复的 key 出现。
如果我们使用自定义类的对象作为 HashMap 的 key,需要保证这个类正确实现了 equals 和 hashCode 方法,否则可能会出现插入 "重复 key" 的情况,正常情况下,这是不符合规范和逻辑的。
HashMap 删除重复元素方案
以下 HashMap 初始测试数据:
public Map initMap = new HashMap<>() {{ put("user1", "张三"); put("user2", "李四"); put("user3", "张三"); put("user4", "李四"); put("user5", "王五"); put("user6", "赵六"); put("user7", "李四"); put("user8", "王五");}};
本文所有完整示例源代码已经上传:
https://github.com/javastacks/javastack
欢迎 Star 学习,后面 Java 示例都会在这上面提供!
1、新创建 Map 添加不重复元素
/** * 新创建 Map 添加不重复元素 * @author: 栈长 * @from: 公众号Java技术栈 */@Testpublic void removeDuplicated1() { Map map = new HashMap<>(); initMap.forEach((k, v) -> { if (!map.containsValue(v)) { map.put(k, v); } }); System.out.println(map);}
这种方法很原始,通过创建一个新 HashMap,添加元素前进行判断,如果元素在新 HashMap 中不存在才进行添加。
2、添加 Set 再删除重复元素
/** * 添加 Set 再删除重复元素 * @author: 栈长 * @from: 公众号Java技术栈 */@Testpublic void removeDuplicated2() { Set set = new HashSet<>(); Iterator> iterator = initMap.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry entry = iterator.next(); if (!set.add(entry.getValue())) { iterator.remove(); } } System.out.println(initMap);}
这种方法和第一种方法大同小异,通过创建一个 HashSet,然后遍历 HashMap,因为 HashSet 是不允许重复元素的,所以,如果 HashSet 能添加元素说明元素没有重复,否则说明元素重复了,然后删除即可。
另外,HashSet、HashMap 的关系也是面试必问的,如果你近期准备面试跳槽,建议在Java面试库小程序在线刷题,涵盖 2000+ 道 Java 面试题,几乎覆盖了所有主流技术面试题。
3、使用 Stream 删除重复元素
/** * 使用 Stream 删除重复元素 * @author: 栈长 * @from: 公众号Java技术栈 */@Testpublic void removeDuplicated3() { Map resultMap = initMap.entrySet().stream().collect( Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey, (key1, key2) -> key1) ).entrySet().stream().collect( Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey, (key1, key2) -> key1) ); System.out.println(resultMap);}
利用 Stream 的 collect 方法重新进行收集,这个方法也十分简单,一行代码搞定,为了可读性,文中代码进行了换行。Stream 基础就不介绍了,Stream 系列我之前写过一个专题了,不懂的关注公众号Java技术栈,然后在公众号 Java 教程菜单中阅读。
Collectors.toMap 方法返回的是一个Collector,它可以将元素累积到 Map 中,Map 的键和值将提供的映射函数应用到输入元素的结果,如果映射的键包含重复项,则值映射函数会使用提供的 merge 函数进行结果合并。
Collectors.toMap 方法可以对 Key 进行去重合并,这也是为什么进行了两次 collect 收集的原因:
第一次收集:
把 Value 作为 Key,Key 作为 Value,这样就能使用 Value 进行去重了,输出结果:
虽然能去重了,但是 HashMap 中的 Key 和 Value 值却颠倒了,所以需要第二次收集。
第二次收集:
现在的 Key 是之前的 Value,所以需要再相互换过来,输出结果:
这个方法比较绕,虽然能一行代码搞定,但代码很冗余,不是很优雅,最重要的是这两次的收集过程会创建两次新 Map,相对比较耗内存。
总结
本文总结了 3 种删除 HashMap 重复元素的方法:
- 新创建 Map 添加不重复元素
- 添加 Set 再删除重复元素(推荐)
- 使用 Stream 删除重复元素
实际开发过程中,可能会使用不同的遍历方式,使用哪种删除方案可以根据不同的遍历方式进行选择,但推荐使用 Set 方案,可以直接删除 Map 中的重复元素,不会创建新的 HashMap。
另外,遍历集合时需要重点考虑是否有多线程修改元素的场景,可能导致的并发修改异常,参考之前文章中介绍的方案,这里不再撰述了。
本文所有完整示例源代码已经上传:
https://github.com/javastacks/javastack
欢迎 Star 学习,后面 Java 示例都会在这上面提供!
你身边还有谁不会删除 HashMap 中的重复元素?把这篇文章发给他吧,让大家少走弯路,少写垃圾代码,共同进步。
你还知道哪些 HashMap 去重技巧?欢迎留言分享~
好了,今天的分享就到这里了,后面栈长会分享更多好玩的 Java 技术和最新的技术资讯,关注公众号Java技术栈第一时间推送,我也将主流 Java 面试题和参考答案都整理好了,大家可以在Java面试库小程序进行刷题。
版权声明:本文系公众号 "Java技术栈" 原创,转载、引用本文内容请注明出处,抄袭、洗稿一律投诉侵权,后果自负,并保留追究其法律责任的权利。
近期热文推荐:
1.1,000+ 道 Java面试题及答案整理(2022最新版)
2.劲爆!Java 协程要来了。。。
3.Spring Boot 2.x 教程,太全了!
4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!
5.《Java开发手册(嵩山版)》最新发布,速速下载!
觉得不错,别忘了随手点赞+转发哦!
关键词:
-
焦点资讯:GO语言学习笔记-测试篇 Study for Go ! Chapter ten- Test
持续更新Go语言学习进度中 GO语言学习笔记-类型篇StudyforGo!Chapterone-Type-slowlydance2me-博客园(cnblogs
来源: -
要闻速递:面试官:怎么删除 HashMap 中的重复元素?第 3 种实现思路,99% 的人不会!
背景大家好,我是栈长。前些天,栈长给大家分享了3篇实用的文章:带了一个3年的开发,不会循环删除List...
来源: 焦点资讯:GO语言学习笔记-测试篇 Study for Go ! Chapter ten- Test
要闻速递:面试官:怎么删除 HashMap 中的重复元素?第 3 种实现思路,99% 的人不会!
世界快消息!k8s的Helm 工具安装
RPC框架JMH测试-chatgpt自动生成
前端设计模式——代理模式
全球视讯!特斯拉叫停与比亚迪合作?比亚迪回应:不实信息
环球即时:苹果人事巨震:11位高管扎堆离职 库克也要降薪40%
微头条丨燃油车 真凉透了吗
【天天时快讯】采用全新NT架构:新Windows端QQ首个版本将于24日发布
世界资讯:剧版打破多项纪录!爱奇艺考虑拍《狂飙》电影版 网友评论两级分化
每日看点!插件化开发详解
关注:读Java性能权威指南(第2版)笔记16_垃圾回收C
全球滚动:京东小程序CI工具实践
巧妙使用SQL Server的计算列实现项目唯一规则快速定制
天天快资讯:免费玩没戏 《暗黑4》不会加入微软XGP:四五百块还是要花的
首位华裔奥斯卡影后!杨紫琼84岁母亲喜极而泣 为女儿感到自豪
世界微资讯!Redis内存碎片深入分析
多举措提高职教吸引力 助力职业教育“强起来”“活起来”
焦点简讯:曝苹果最快2024年商用MicroLED屏:比OLED更香
今日快讯:7月1日普及!我国将全面淘汰传统后视镜 都换汽车电子后视镜:上游供应链已准备好
全球今日报丨老人捡钱不愿归还 女孩崩溃下跪引网友愤怒:律师称可起诉 专家喊话不能仗着年龄大
环球新动态:适合买二手的硬件只有4个:学会省1000元
K8S-Helm
资讯:04-数据类型
环球动态:在Linux中安装containerd作为kubernetes的容器运行时
当前通讯!“自杀式”降价杀红眼:燃油车真凉透了?
乘客出地铁黄鹤楼站的统一姿势:集体反站拍摄绝美夜景
天天动态:大爷充29万做美容反悔起诉退钱:宣称能打通“任督二脉”等
世界聚焦:硅谷银行破产:在营销号那儿 咋又成美国赢了?
从大厂离职后 游戏程序员们过得咋样?
鲍美瑶男朋友大白_鲍美瑶
即时看!第129篇:JS模块化开发
每日快播:Yus框架之nl子级管控指令
鼻炎患者要注意了!今年花粉高峰期来得猛又早:将持续数月
中消协等倡议推广小份菜、半份菜:鼓励线上点餐推出“菜量自动提醒”功能
焦点速读:《流浪地球2》上映51天票房破40亿 豆瓣评分又涨了!导演自曝第三部
AMD技术岗最高头衔!DX10/11发明人、皓龙处理器之父等升任企业院士
22-23(2)第2次线上赛
【打怪升级】【rocketMq】rocket的持久化
Linux进程与线程的基本概念及区别
天天消息!k8s单节点改为高可用和更新证书
世界滚动:这还是中国乒乓球吗?王牌选手接连倒下,对手赢球后开心改签机票
欧盟约法三章:苹果无法对iPhone 15 USB-C加密来限制充电速度
每日快报!董明珠称很烦吹捧她的员工:不敢讲真话 没法信任
环球滚动:高尔夫球“名场面”或消失!剧版《最后生还者2》将修改原作剧情
马来西亚原装进口:猫山王榴莲雪糕4.9元/支四折发车
焦点讯息:联想YOGA Pro系列升级:新机全系标配32GB内存+1TB存储
环球今亮点!清华博士回应送外卖:不是炒作 曾创业欠下了百万元债务
环球今热点:299元 雷神X3电竞路由器上架:512MB内存 可253台设备同时连
即时看!比亚迪又拿大单:英国公司订购5000辆元Plus EV 价格比国内贵了一倍
全球热点!最强消费级PCIe 5.0 SSD有多强!技嘉大雕510K 2TB评测:顺序读写破10GB/s、4K超100MB/s
全球速讯:使用symbolicatecrash工具符号化Crash日志
环球速看:开心档之HTML 属性
全球热门:博雅互动(00434.HK)将于3月23日举行董事会会议以审批全年业绩
世界消息!官方:着力解决自媒体内容失真问题、清除违规吸粉
董明珠称批评人很快乐:帮助对方成长
不受支持的PC强行升级Win11 烦人的水印又回来了 微软回应
快看:PPT既视感!电视剧《狂飙》更换新片头:曾被指抄袭网飞纪录片
天天最资讯丨哈佛大学研究:体力劳动更多的男性生育能力更强
当前热点-网站https 问题记录
出道即封神的ChatGPT,现在怎么样了?
IntelliJ IDEA使用教程——不使用maven管理下导入jar包
每日精选:使用Docker搭建MinIO集群服务
CommonsBeanUtils1反序列化分析
全球快资讯:董明珠:如果员工经常在我面前拍马屁 我就开除他
当前关注:网店因商品拆封拒绝七天无理由退货:最终被罚4万元
焦点!全村停电 男子用比亚迪DM-i给自家全屋供电 邻居:为啥就他家有电?
丫丫伙食新添胡萝卜:但它没碰
天天快讯:剧版《最后生还者》顺利收官:M站评分达84分
CommonsCollections4反序列化分析
环球视讯!前端开发爬虫首选puppeteer
聚焦:subtotal函数的作用_SUBTOTAL函数的用法
环球观天下!中国移动涨停 市值2.1万亿创历史新高 挑战A股第一贵州茅台
今日聚焦!亲肤0刺激 润本婴儿驱蚊喷雾大瓶9.9(超市39.9)
天天视讯!高蛋白低脂美味!舌里减脂鸡胸肉5袋到手12.9元
头条焦点:净利润翻倍 宁德时代在补什么课?
最新资讯:卖事故车被判退一赔三!车主:特斯拉让我赔代步车50万租金
环球消息!【数字化运营】PagerDuty平台与上海道宁帮助您的数字基础设施中自动化、编排和加速响应
LocalDateTime应用比较日期
玩家不用担心 分析师称微软收购动视暴雪只会伤害索尼
全球观焦点:游客吐槽25元看海洋馆就几个鱼缸:现场和家里客厅一样大
环球百事通!樱桃推出KW 9200 MINI超薄键盘:剪刀脚按键、三模连接
全球快资讯丨雅阁车主第一次坐比亚迪汉 自侃像是土包子进城 信仰崩塌
焦点讯息:美国公示丫丫回国相关申请:快回家了!
全球观速讯丨二进制安全——缓冲区溢出
每日看点!数组指针&一维数组&二维数组ve
【环球时快讯】面试官:如何在千万级数据中查询 10W 的数据,都有什么方案?
网络安全(中职组)-B模块:压缩包破解
全球快资讯:Rancher 管理 Kubernetes 集群
李想:L7、L8、L9是世界上最安全的车 副驾坐的是我老婆
天天快报!美版《西游记》定档!阵容强大:奥斯卡影后杨紫琼饰观音、吴彦祖演美猴王
日本原装进口!雀巢金牌速溶黑咖啡大促 28.9元到手
Android 14不再允许“杀后台”!一键加速App别装了
上汽投资成立股权投资合伙企业 出资额5亿
环球快资讯丨解惑:教你在 Arch Linux 终端上更改 WiFi 密码
教程|在矩池云使用 Stable Diffusion web UI v1.5 模型和 ControlNet 插件
【环球新要闻】应聘软件测试 HR 会问到哪些问题?收藏这一篇就够了!
Nebius Welcome Round (Div. 1 + Div. 2)
环球快讯:火山引擎 DataTester:一个 A/B 测试,将一款游戏的核心收益提升了 8%
环球最资讯丨华擎Intel显卡集体降价 最多20%:RTX 3060瞬间不香了