java list对象排序_Java 对象集合List排序的5种方式
目标明确
排序对象类
public class Student{
private String name;
private Integer age;
public Student(String name, Integer age) {
this.name = name;
this.age = age;
}
public Student() {
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
方式一:排序对象类实现Comparable接口的compareTo方法
Student类
public class Student implements Comparable{
private String name;
private Integer age;
public Student(String name, Integer age) {
this.name = name;
this.age = age;
}
public Student() {
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
/**
* 需要实现的方法,实现升序排序,降序请反写
* this表示当前的对象
* @param o 比较时传入的对象
* @return
*/
@Override
public int compareTo(Student o) {
return this.age-o.age;
}
}
Main
public class Test {
public static void main(String[] args) {
//数据准备
List list = new ArrayList<>();
list.add(new Student("小明",1));
list.add(new Student("小红",4));
list.add(new Student("小刚",3));
list.add(new Student("小鸡",5));
list.add(new Student("小狗",2));
//使用Collections集合工具类进行排序
Collections.sort(list);
for (Student student : list) {
System.out.println(student);
}
}
}
compareTo方法实际上是一个比较大小的方法,只要是排序,我们必须用到比较,若果是简单的整数数组排序,我们只需要用 > 、 < 等进行比较,但是对于对象来说,Collections集合工具类在进行排序时,每次比较,都是调用的我们实现的compareTo方法,this表示当前对象,o表示要进行比较的传入对象,返回是一个int类型的整数
返回值>0:表示当前对象比传入对象大(年龄)
返回值=0:表示当前对象和传入对象一样大(年龄)
返回值<0:表示当前对象比传入对象小(年龄)
排序结果:
Student{name='小明', age=1}
Student{name='小狗', age=2}
Student{name='小刚', age=3}
Student{name='小红', age=4}
Student{name='小鸡', age=5}
Process finished with exit code
方式二:使用Comparator接口自定义行为
使用方式一我们必须在Student类上面进行修改,这显然不是最好的办法,如果我们不想按年龄排序,想要按照姓名排序,或者我们有一个方法需要按照年龄,另一个方法需要按照姓名,那么重写compareTo方法显然就没法完成我们的目标了,Collections的重载sort方法可以允许我们在排序对象外部自定义一个比较器(Comparator接口的实现类),因为我们仅需要实现compare()方法(实际上Comparator接口是一个函数式接口,无伤大雅最后解释,想了解的看最后),没必要在定义一个类,我们直接使用匿名内部类的方式。
此时的Student类我们不用进行任何改写,和最原始的一样即可
Main
public class Test {
public static void main(String[] args) {
//数据准备
List list = new ArrayList<>();
list.add(new Student("小明",1));
list.add(new Student("小红",4));
list.add(new Student("小刚",3));
list.add(new Student("小鸡",5));
list.add(new Student("小狗",2));
//使用Collections集合工具类进行排序
Collections.sort(list, new Comparator() {
@Override
public int compare(Student o1, Student o2) {
//升序排序,降序反写
return o1.getAge()-o2.getAge();
}
});
for (Student student : list) {
System.out.println(student);
}
}
}
排序结果:
Student{name='小明', age=1}
Student{name='小狗', age=2}
Student{name='小刚', age=3}
Student{name='小红', age=4}
Student{name='小鸡', age=5}
Process finished with exit code 0
我们也可以使用List的sort方法(这是List接口的一个默认方法)源码如下:
@SuppressWarnings({"unchecked", "rawtypes"})
default void sort(Comparator super E> c) {
Object[] a = this.toArray();
Arrays.sort(a, (Comparator) c);
ListIterator i = this.listIterator();
for (Object e : a) {
i.next();
i.set((E) e);
}
}
我们也需要传入一个Comparator,此处使用匿名类的形式,代码如下:
public static void main(String[] args) {
//数据准备
List list = new ArrayList<>();
list.add(new Student("小明",1));
list.add(new Student("小红",4));
list.add(new Student("小刚",3));
list.add(new Student("小鸡",5));
list.add(new Student("小狗",2));
list.sort(new Comparator() {
@Override
public int compare(Student o1, Student o2) {
return o1.getAge()-o2.getAge();
}
});
for (Student student : list) {
System.out.println(student);
}
}
方式三:Lambda表达式
方式二相比,只改变了一行代码
将
Collections.sort(list, new Comparator() {
@Override
public int compare(Student o1, Student o2) {
//升序排序,降序反写
return o1.getAge()-o2.getAge();
}
});
变为
Collections.sort(list, (o1, o2) -> o1.getAge() - o2.getAge());
或者使用list的sort方法:
将
list.sort(new Comparator() {
@Override
public int compare(Student o1, Student o2) {
return o1.getAge()-o2.getAge();
}
});
变为:
list.sort((o1, o2) -> o1.getAge()-o2.getAge());
方式四:使用方法引用进一步简化
上文方式三
Collections.sort(list, (o1, o2) -> o1.getAge() - o2.getAge());
可以变为:
Collections.sort(list, Comparator.comparingInt(Student::getAge));
使用List的sort方法时:
list.sort((o1, o2) -> o1.getAge()-o2.getAge());
可以改为
list.sort(Comparator.comparingInt(Student::getAge));
方式五:使用Stream流
List students = list.stream().
sorted((Comparator.comparingInt(Student::getAge)))
.collect(Collectors.toList());
注:返回一个有序的List集合
关于Comparator接口
上文说Comparator接口是一个函数式接口,那么什么是函数式接口呢?
函数式接口就是只定义一个抽象方法的接口。
JDK1.8开始支持默认方法,即便这个接口拥有很多默认方法,只要接口只有一个抽象方法,那么这个接口就是函数式接口。
函数式接口常常用@FunctionInterface来标注,不是必须的,带有@FunctionInterface注解的接口如果不满足函数式接口(有多个抽象方法),编译器会返回提示信息,自己创建函数式接口时推荐使用。
end
java list对象排序_Java 对象集合List排序的5种方式相关推荐
- winform list集合怎么 in过滤_Java List集合遍历数据的八种方式
准备工作:使用静态块初始化List数据 private static List list;//静态块 ==> 初始化ArrayListstatic { list = new ArrayList& ...
- java 文件下载详解_Java 从网上下载文件的几种方式实例代码详解
废话不多说了,直接给大家贴代码了,具体代码如下所示: package com.github.pandafang.tool; import java.io.BufferedOutputStream; i ...
- java中map类型_Java中Map类型遍历的两种方式对比
Java中Map类型是存储键值对数据的类型,在编程过程经常使用,进行遍历操作对于每个Java程序员都不会模式,下面总结两种常用的遍历方式(一种keySet,一种entrySet),通过对比让你明白使用 ...
- java跳出for循环_Java跳出多层for循环的4种方式
Java跳出多层for循环的4种方式 一.使用return关键字控制 for (int i = 0;i<10;i++){ for (int j = 0; j<10; j++) { if ( ...
- java struts2下载文件_java struts2入门学习---文件下载的二种方式
一.关于文件下载: 文件下载的核心思想即是将文件从一个地方拷贝到另一个地方. 1.传统方式: 在Action中加入大量servlet api 操作.优点是好理解,缺点是耦合度高. 2.stream方式 ...
- java base64 编码 类_java base64编码和解码的三种方式 | 学步园
方式一:使用commons-codec.jar /** * @param bytes * @return */ public static byte[] decode(final byte[] byt ...
- java操作oracle数据_Java jdbc操作oracle数据库的两种方式
本文由广州疯狂软件java培训分享: 第一种应该是比较古老的方法了. Windows下采用JDBC-ODBC Bridge连接oracle数据库 1. 安装oracle客户端程序,在tnsnames. ...
- Java版数据结构之单向链表 新增,有序新增的两种方式,修改和删除(CRUD)
Java版数据结构之单向链表 CRUD Java版数据结构之单向链表 新增,有序新增的两种方式,修改和删除; 留了一个疑问; 我的代码仓库:https://github.com/zhuangbinan ...
- java对汉字按照拼音首字母排序_java对象集合中某个属性的汉字进行按拼音进行排序...
在开发中,有些时候我们要对一个集合中的对象的某个属性进行按拼音排序,便于更快的找到汉字,我采用Comparator接口,在实现这个接口里定义排序规则,取得比较对象的汉字编码,并将其转换成字符串,运用S ...
- java json 对象如何对属性排序_Java对象集合、对象数组如何排序?你需要知道这两种方式...
一.引子 在比较Java对象时,正常情况下,我们只能使用==或!=进行比较,而不能使用>或者<这样的运算符. 那么问题来了,开发过程中我们经常要对多个对象排序,排序必然需要比较,那么如何实 ...
最新文章
- spring2.0和spring2.5及以上版本的jar包区别 spring jar 包详解
- Java中实现按字符串位数在前面补0
- PackageManagerService启动过程
- Valve开发校准软件,LCD屏也能与高端VR头显适配了
- Java面试题集合(比较实用)
- Powerful Sleep(神奇的睡眠-睡眠生物钟的秘密:如何睡得更少却睡得更好)阅读笔记...
- android界面的滑动切换功能
- 【20】java里的this和static
- 区块链开源框架 HyperLedger Fabric 学习思路分享
- MetadataReader、ClassMetadata、AnnotationMetadata的简单使用
- easypoi/easyExcel导出excel(xls,xlsx)后,文件打开错误或乱码的解决方法
- 一、Oracle11g简介
- 邮件服务器备案,关于企业邮箱域名备案事项通知
- 你了解资金盘吗?那孪生兄弟产品盘你知道吗?
- Linux用户层和内核文件读写
- 学习要有但行好事,莫问前程的心态
- 二.英语语法 - 并列句
- 回望过去,感觉现在的自己十分功利
- 安装python与编译工具vs code(中文版)和pycharm(中文版)
- WiFi共享精灵 - 不需路由器一键轻松把网线共享给手机、笔记本等同时无线上网_我是亲民_新浪博客...
热门文章
- Java周总结_mysql_jdbc
- java获取当前项目相对路径_怎样在JAVA文件中获取该项目的相对路径
- ARM-ASM汇编指令
- 中职学校计算机专业课程设置,浅谈中职学校计算机专业的定位与课程设置
- 一、Java并发编程之线程、synchronized
- 金仓数据库字段_技术干货 | 超实用!详解人大金仓MPP数据库并行查询技术
- java 并发 调优_阅读笔记一——java高并发的性能优化
- hibernate中的hql语句,字符串时间范围筛选处理
- python代码练习2
- 【Paper】【Compute Vision】Best Paper Awards in Computer Science (since 1996)