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

用Java ArrayList实现一个简单的数组去重功能

方案1:双层循环遍历去重(不依赖其他集合,纯ArrayList)

思路:

  1. 创建新的 ArrayList 存放结果
  2. 遍历原集合每一个元素
  3. 新集合中不存在该元素才添加,自动去重
importjava.util.ArrayList;publicclassArrayListDistinct1{publicstaticvoidmain(String[]args){// 原数组,包含重复数据ArrayList<Integer>list=newArrayList<>();list.add(1);list.add(2);list.add(2);list.add(3);list.add(1);list.add(4);list.add(3);System.out.println("去重前:"+list);ArrayList<Integer>newList=distinctByLoop(list);System.out.println("去重后:"+newList);}/** * 双层循环去重,保留原有顺序 */publicstatic<E>ArrayList<E>distinctByLoop(ArrayList<E>oldList){ArrayList<E>result=newArrayList<>();for(Eitem:oldList){// 新集合没有当前元素才添加if(!result.contains(item)){result.add(item);}}returnresult;}}

输出:

去重前:[1, 2, 2, 3, 1, 4, 3] 去重后:[1, 2, 3, 4]

优点:仅使用 ArrayList,不引入其他类;保留插入顺序
缺点:contains()底层遍历,数据量大性能差 O(n²)

方案2:借助 HashSet 快速去重(性能更高,推荐)

思路:Set 天然不允许重复元素,中转去重后转回 ArrayList

importjava.util.ArrayList;importjava.util.HashSet;importjava.util.Set;publicclassArrayListDistinct2{publicstaticvoidmain(String[]args){ArrayList<String>list=newArrayList<>();list.add("苹果");list.add("香蕉");list.add("苹果");list.add("橙子");list.add("香蕉");System.out.println("去重前:"+list);ArrayList<String>distinctList=distinctBySet(list);System.out.println("去重后:"+distinctList);}publicstatic<E>ArrayList<E>distinctBySet(ArrayList<E>oldList){// Set自动去重Set<E>set=newHashSet<>(oldList);// 转回ArrayListreturnnewArrayList<>(set);}}

注意:HashSet 会打乱原有元素顺序。

如果需要【去重+保留顺序】用 LinkedHashSet

importjava.util.ArrayList;importjava.util.LinkedHashSet;importjava.util.Set;publicclassDistinctOrder{publicstatic<E>ArrayList<E>distinctKeepOrder(ArrayList<E>oldList){Set<E>set=newLinkedHashSet<>(oldList);returnnewArrayList<>(set);}publicstaticvoidmain(String[]args){ArrayList<Integer>list=newArrayList<>();list.add(5);list.add(3);list.add(5);list.add(1);ArrayList<Integer>res=distinctKeepOrder(list);System.out.println(res);// [5, 3, 1] 顺序不变}}

方案3:Java8 Stream一行代码去重(最简写法)

importjava.util.ArrayList;importjava.util.List;publicclassStreamDistinct{publicstaticvoidmain(String[]args){ArrayList<Integer>list=newArrayList<>();list.add(2);list.add(2);list.add(7);list.add(7);list.add(9);// distinct() 去重,collect转回ArrayListList<Integer>distinctList=list.stream().distinct().toList();System.out.println(distinctList);}}

总结对比

方式优点缺点
双层循环contains只使用ArrayList、有序大数据效率低
LinkedHashSet效率高、有序需要导入Set集合
Stream distinct代码极简JDK8+支持
http://www.jsqmd.com/news/1085908/

相关文章:

  • Eaton XTCE820N抑制器
  • KuaiRec 数据集:从99.6%稠密度到推荐系统评估新范式的实践指南
  • ESP32-S3硬件I2C驱动AHT20:从芯片手册到多任务数据采集实战
  • 瑞萨RA8P1 MCU SRAM安全与ECC配置实战指南
  • 深入解析Mermaid:高效创建专业图表的完整指南
  • 基于STM32F103C8T6与HX711的电子秤设计:HAL库驱动与数据校准实战
  • Py之scikit-learn-extra:从安装到实战,解锁scikit-learn官方扩展库的进阶用法
  • d2s-editor:5个实用技巧让你成为暗黑2存档编辑大师
  • RA8T2 ADC16H进阶数据处理:比较匹配与FIFO功能实战解析
  • 【技术解析】MIPI D-PHY:从电气特性到高速传输的实战指南
  • 5分钟部署:Arknights-Mower明日方舟自动化工具终极指南
  • 终极指南:3分钟搞定游戏乱码!Locale Remulator让你的日韩游戏完美显示
  • 从STM32H7到AK4499EX:构建高解析度DSD音乐播放器的硬件架构与选型思考
  • Windows原生运行安卓应用:APK安装器如何实现3分钟快速部署?
  • Win11虚拟机频繁蓝屏?VMware与Hyper-V兼容性冲突的排查与修复
  • 从二维到三维:GIS坐标转换中的四参数与七参数实战解析
  • CoppeliaSim实战:从STL模型到可驱动机械臂的完整动力学建模流程
  • STM32F1 HAL库SD卡DMA模式下的FATFS移植与性能优化
  • 告别空白图标:用SVG Explorer Extension点亮Windows文件资源管理器
  • B站会员购抢票神器biliTickerBuy:告别手速焦虑的终极解决方案
  • Yakit+Nuclei:新手友好的图形化漏洞验证实战指南
  • AI 链上推理:去中心化模型执行与验证的可信计算架构
  • 三层安全防护 + 命令白名单:一个敢带进生产的 AI 运维排查脚本
  • 阿里巴巴 算法岗笔试真题【坏掉的键盘】
  • 从OHEM到Focal Loss:深入剖析目标检测中的难例挖掘策略演进与PyTorch实战
  • 从ORA-00257归档错误到系统恢复:Oracle DBA的实战排障与空间治理
  • 从Co-training到多视图学习:如何让AI模型“多角度看世界”以提升性能?
  • 亚马逊为何放弃 OpenAI 电影项目?数据中心员工奋起反抗,Meta 泄露员工数据
  • FinalShell密码找回:从本地存储到Java解码的完整实践
  • 如何为Windows XP/2003构建创新兼容层:突破性解决方案指南