当前位置: 首页 > 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.gsyq.cn/news/1597856.html

相关文章:

  • 深入解析Mermaid:高效创建专业图表的完整指南
  • d2s-editor:5个实用技巧让你成为暗黑2存档编辑大师
  • 终极指南:3分钟搞定游戏乱码!Locale Remulator让你的日韩游戏完美显示
  • 从二维到三维:GIS坐标转换中的四参数与七参数实战解析
  • Windows原生运行安卓应用:APK安装器如何实现3分钟快速部署?
  • CoppeliaSim实战:从STL模型到可驱动机械臂的完整动力学建模流程
  • STM32F1 HAL库SD卡DMA模式下的FATFS移植与性能优化
  • B站会员购抢票神器biliTickerBuy:告别手速焦虑的终极解决方案
  • Yakit+Nuclei:新手友好的图形化漏洞验证实战指南
  • 从OHEM到Focal Loss:深入剖析目标检测中的难例挖掘策略演进与PyTorch实战
  • 亚马逊为何放弃 OpenAI 电影项目?数据中心员工奋起反抗,Meta 泄露员工数据
  • 如何为Windows XP/2003构建创新兼容层:突破性解决方案指南
  • 5分钟构建专业可视化图表:Mermaid Live Editor的交互式设计革命
  • 技术人的‘讲真话’:在代码与协作中构建可信赖的工程文化
  • 从零上手JupyterLab:一站式安装、配置与核心功能实战
  • 计算机视觉的油气管道智能监测系统
  • Translumo:Windows平台终极实时屏幕翻译工具,3分钟实现跨语言无障碍体验
  • 【OpenAI】GPTs应用实战:从零构建与外部API集成的智能助手
  • AMD显卡驱动精简终极指南:如何用Radeon Software Slimmer提升系统性能
  • 从电赛真题看边缘AI如何重塑智能硬件设计
  • Python实战:利用scipy.stats精准计算标准正态分布分位点
  • 从固件到操作系统:深入解析ACPI规范6.4的初始化与运行时模型
  • 2026深度实测|5款主流AI编程工具全方位测评,企业开发必看
  • Qt6开发实战:提升效率的Qt Creator核心功能解析
  • 告别网盘限速烦恼:3分钟搭建你的个人直链解析服务
  • BetterNCM插件管理器:3分钟解锁网易云音乐无限扩展功能
  • ROFLPlayer:英雄联盟回放文件查看与播放的终极免费方案
  • Windows窗口置顶神器:如何让任意窗口始终显示在最上层
  • 告别Eclipse,拥抱VS Code:SAP Fiori Tools一站式开发环境「搭建指南」
  • 华三BAGG链路聚合与IRF堆叠在企业园区网中的融合部署实践