知识点巩固

首先明确两个点

ArraryList

ArrayList虽然是有序的但它是按照存入顺序进行保存,并不是我们所想的排序;

ArrayList<Integer> list = new ArrayList();
list.add(23);
list.add(12);
list.add(24);
list.add(22);
list.add(22);
list.add(22);
list.add(45);
list.add(3);

从代码中我们可知我在list中放入的元素是一些int数字,而且是随机大小存入的,那么我们使用debug来看看他的内部情况

结论:ArrayList所谓的有序性是指我们放入元素的顺序,而非按照元素的大小进行排序保存,并且不会对元素进行去重,也就是说ArrayList保存元素具有重复性;

HashSet

HashSet存入元素虽然无序但是它有去重的特性;

HashSet<Integer> set = new HashSet<>();
set.add(23);
set.add(12);
set.add(24);
set.add(22);
set.add(22);
set.add(22);
set.add(45);
set.add(3);

我在HashSet中放入了一些数字,并且有3个22,依旧使用debug查看它的内部元素情况;

结论:HashSet存入元素是没有任何顺序的,既不会按照你放入的顺序也不会按照元素的大小进行排序,所以说明HashSet有无序性,但是注意HashSet存入的元素中,22只出现了一次,说明HashSet不能保存重复的元素,即HashSet保存元素具有唯一性、去重性;


测试数据

以下皆使用该数据进行测试

ArrayList<Integer> list = new ArrayList();
list.add(7);
list.add(5);
list.add(9);
list.add(8);
list.add(8);
list.add(8);
list.add(2);
list.add(3);

去重

回顾了ArrayList和HashSet,我们就可以根据他们的特性对ArrayList进行相关的操作,首先是对ArrayList进行去重

注意 以下方法在对对象进行去重时必须重写pojo类的equals(),否则HashSet会认为你内容完全相同的两个对象不相等

方式一

利用HashSet唯一性的特点对ArrayList进行去重

HashSet<Integer> set = new HashSet<>(list);
list = new ArrayList<>(set);

使用HashSet去重后会影响元素原有的位置,可以替换为LinkedHashSet保持元素原来的顺序

方式二

利用另一个临时的ArrayList配合contains()方法去重

ArrayList<Integer> temp = new ArrayList<>();
for (Integer i : list)if (!temp.contains(i))temp.add(i);
list = temp;

方式三

利用indexOf()和lastIndexOf()获取元素第一次和最后一次出现的位置,若位置相同则说明元素只有一个,若不相同则说明有重复该元素

Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()){Integer i = iterator.next();// 如果i第一次出现的位置和最后一次出现的位置不相同则说明有重复的iif (list.indexOf(i) != list.lastIndexOf(i))iterator.remove();
}

此方法使用迭代器,如果该元素有重复则将该元素从迭代器中移除

方式四

利用Stream的distinct()对list去重(JDK 1.8)

List<Integer> list = this.list.stream().distinct().collect(Collectors.toList());

其他

可以使用一些集合内的方法,比如addAll(),其实和以上方法的原理大同小异

ArrayList<Integer> newList = new ArrayList<>();
HashSet<Integer> set = new HashSet<>();
set.addAll(list);
newList.addAll(set);

排序

对数字类型的排序

使用sort()方法,以匿名内部类方式传入一个比较器,重写compare()方法

list.sort(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {// 正序排序return o1 - o2;// 倒序排序// return o2 - o1;}
});

对对象类型的排序

以下皆使用该数据进行测试

定义一个Person对象,有int id、String name、int age三个属性(使用了Lombok工具)

@Data
@AllArgsConstructor
public class Person{private int id;private String name;private int age;
}

测试用对象数据

ArrayList<Person> list = new ArrayList<>();list.add(new Person(4,"Jack",22));list.add(new Person(7,"Maria",20));list.add(new Person(5,"Lucy",24));list.add(new Person(2,"Alix",24));list.add(new Person(9,"Rote",25));

排序前遍历元素

Person(id=4, name=Jack, age=22)
Person(id=7, name=Maria, age=20)
Person(id=5, name=Lucy, age=24)
Person(id=2, name=Alix, age=24)
Person(id=9, name=Rote, age=25)

Comparable

使用Comparable的前提是,pojo类必须实现Comparable接口

@Data
@AllArgsConstructor
public class Person implements Comparable<Person>{private int id;private String name;private int age;@Overridepublic int compareTo(Person p) {// 按照String属性排序// 正序排序return this.getName().compareTo(p.getName());// 倒序排序// return p.getName().compareTo(this.getName());}
}

然后使用Collections.sort()方法对list进行排序,sort()会自动匹配Person实现的比较器(Comparable),根据比较器内的规则对Pserson实例进行排序

Collections.sort(list); // 使用Collections的sort()方法

遍历输出(按照name进行排序)

Person(id=5, name=Alix, age=24)
Person(id=4, name=Jack, age=22)
Person(id=2, name=Lucy, age=24)
Person(id=7, name=Maria, age=20)
Person(id=9, name=Rote, age=25)

Collections.sort(list)以定义的实现规则按照name对Person对象进行正序排序(A-Z)

Comparator

Comparator比Comparable更简单,可以使用匿名内部类进行实现,并且可以进行复杂逻辑的规则实现,能够按照更多的条件进行排序

// 直接使用list的sort()方法,用匿名内部类方式实现Comparator
list.sort(new Comparator<Person>() {@Overridepublic int compare(Person o1, Person o2) {// 优先按照age排序if (o1.getAge() != o2.getAge() ) { // 若两个person的age不相等则按age正序排序return o1.getAge() - o2.getAge();} else { // 若age相同则按照name正序排序return o1.getName().compareTo(o2.getName());}}
});

遍历输出

Person(id=7, name=Maria, age=20)
Person(id=4, name=Jack, age=22)
Person(id=2, name=Alix, age=24)
Person(id=5, name=Lucy, age=24)
Person(id=9, name=Rote, age=25)

sort()先按照age进行了正确的正序排列,当遇到两个相同的age=24时,它又对name进行了判定,让原本在Lucy后面的Alix排在了前面


后言

你好,很高兴认识你

本次关于 “ 如何对ArrayList进行去重、排序 ” 的文章到此完结,其实除了这些主要的方式,还有很多其他方法可以进行实现,若有疑问可以私信与我交流。

如果你也喜欢编程,如果你也喜欢敲代码,如果你也喜欢技术,欢迎联系~

我是

爱敲代码的小王bro

#笔记 如何对ArrayList进行去重、排序相关推荐

  1. ArrayList的去重、排序以及其他应用

    介绍了ArrayList集合去重的三种方式,以及排序的两种方式,以及反射获取ArrayList的容量,以及Array和ArrayList的区别. 文章目录 1 Array和ArrayList的区别以及 ...

  2. 题库练习2(随机数去重排序、分割字符串、进制转换)

    1. 随机数去重排序 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉 ...

  3. java 数组去重排序_Java实现的数组去重与排序操作详解

    本文实例讲述了Java实现的数组去重与排序操作.分享给大家供大家参考,具体如下: 这里演示Java实现数组去重.排序操作 文中的示例源码编写基于Jdk1.6+.junit4.8.2 java.util ...

  4. sql按时间取去重最近_sql 去重排序及 java分页

    一.sql去重排序: 需求,对数据库数据按mfrom去重(显示最新数据),并对去重后的数据按mcreated_time进行倒序排列: sql语句为: (1)SELECT * FROM messages ...

  5. python中排序英文单词怎么写_Python实现对文件进行单词划分并去重排序操作示例...

    本文实例讲述了Python实现对文件进行单词划分并去重排序操作.,具体如下: 文件名:test1.txt 文件内容: But soft what light through yonder window ...

  6. Java ArrayList的不同排序方法

    由于其功能性和灵活性,ArrayList是 Java 集合框架中使用最为普遍的集合类之一.ArrayList 是一种 List 实现,它的内部用一个动态数组来存储元素,因此 ArrayList 能够在 ...

  7. python编程单词排序_Python实现对文件进行单词划分并去重排序操作示例

    本文实例讲述了Python实现对文件进行单词划分并去重排序操作.分享给大家供大家参考,具体如下: 文件名:test1.txt 文件内容: But soft what light through yon ...

  8. excel如何去重统计户数_公式解读第三期 单元格中数字如何去重排序?

    公式解读 第三期 -单元格中数字的去重排序!本期涉及到函数较多,你可以一次性根据这个案例,学习多少很多常用 函数的用法,同时我也会讲解思路,这个很重要,思路决定了出路.直接先看一下我们的效果图: 效果 ...

  9. 去重+排序板子(set+map)

    题意: 给定n个数,去重排序后输出个数和每个数 1.map实现 #pragma GCC optimize("O2") #include<iostream> #inclu ...

最新文章

  1. 支持支付宝(Alipay)付款的三个美国主机商
  2. Objective-C:OC内部可变对象和不可变对象的深(复制)拷贝问题思考:
  3. 2019长安大学ACM校赛网络同步赛 J Binary Number(组合数学+贪心)
  4. 关于aop:pointcut的expression配制说明及JoinPoint
  5. 我搜集的C++字符类型的相互转换
  6. HBase键值分片的简单运用
  7. 帆软报表(finereport)点击事件对话框打开
  8. 双向口 与 准双向口 区别
  9. CISSP避坑经验指南
  10. 易语言斗鱼弹幕助手源码
  11. 74cms php在那个文件夹里面,74cms后台getshell
  12. Angular基本概念及用法总结
  13. 分数排名 leecode 学习笔记
  14. python程序员推荐笔记本_震惊脸!这5个软件难道只有Python程序员才知道吗?
  15. 小福利,带你快速入门sumifs多条件求和函数、设置下拉菜单结合vlookup函数双条件查找数据、excel的切片器(表关联)、数据透视表、数据透视图
  16. jetson-nano环境查询
  17. 9、osg3.2.1中漫游
  18. 2022年化工自动化控制仪表考试题模拟考试题库及在线模拟考试
  19. mysql sdo geometry_SDO_Geometry相关学习(转载)
  20. 高频变压器(脉冲变压器)的设计与制作

热门文章

  1. mysql安装时卡在starting server的解决方法
  2. 超级计算机1月冷空气,一个冬天没下雪的北京终于要下雪了?超级计算机:还不能完全确定...
  3. Microsoft office 加载项提示安装office自定义项安装期间出错
  4. Docker搭建php本地开发环境 - 保姆教程
  5. 制作6D姿态数据集常用的BCH码背景图下载
  6. mysql repeatableread_关于 MySQL 的事务隔离级别(REPEATABLE READ)
  7. 全球与中国室内运动地板市场深度研究分析报告
  8. Footprint Expert PRO 22 - 自定义封装 - mark点
  9. Java使用HttpClient发送Https请求证书失效:PKIX path building failed:
  10. IOS 解决证书失效的问题