目标明确

排序对象类

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种方式相关推荐

  1. winform list集合怎么 in过滤_Java List集合遍历数据的八种方式

    准备工作:使用静态块初始化List数据 private static List list;//静态块 ==> 初始化ArrayListstatic { list = new ArrayList& ...

  2. java 文件下载详解_Java 从网上下载文件的几种方式实例代码详解

    废话不多说了,直接给大家贴代码了,具体代码如下所示: package com.github.pandafang.tool; import java.io.BufferedOutputStream; i ...

  3. java中map类型_Java中Map类型遍历的两种方式对比

    Java中Map类型是存储键值对数据的类型,在编程过程经常使用,进行遍历操作对于每个Java程序员都不会模式,下面总结两种常用的遍历方式(一种keySet,一种entrySet),通过对比让你明白使用 ...

  4. java跳出for循环_Java跳出多层for循环的4种方式

    Java跳出多层for循环的4种方式 一.使用return关键字控制 for (int i = 0;i<10;i++){ for (int j = 0; j<10; j++) { if ( ...

  5. java struts2下载文件_java struts2入门学习---文件下载的二种方式

    一.关于文件下载: 文件下载的核心思想即是将文件从一个地方拷贝到另一个地方. 1.传统方式: 在Action中加入大量servlet api 操作.优点是好理解,缺点是耦合度高. 2.stream方式 ...

  6. java base64 编码 类_java base64编码和解码的三种方式 | 学步园

    方式一:使用commons-codec.jar /** * @param bytes * @return */ public static byte[] decode(final byte[] byt ...

  7. java操作oracle数据_Java jdbc操作oracle数据库的两种方式

    本文由广州疯狂软件java培训分享: 第一种应该是比较古老的方法了. Windows下采用JDBC-ODBC Bridge连接oracle数据库 1. 安装oracle客户端程序,在tnsnames. ...

  8. Java版数据结构之单向链表 新增,有序新增的两种方式,修改和删除(CRUD)

    Java版数据结构之单向链表 CRUD Java版数据结构之单向链表 新增,有序新增的两种方式,修改和删除; 留了一个疑问; 我的代码仓库:https://github.com/zhuangbinan ...

  9. java对汉字按照拼音首字母排序_java对象集合中某个属性的汉字进行按拼音进行排序...

    在开发中,有些时候我们要对一个集合中的对象的某个属性进行按拼音排序,便于更快的找到汉字,我采用Comparator接口,在实现这个接口里定义排序规则,取得比较对象的汉字编码,并将其转换成字符串,运用S ...

  10. java json 对象如何对属性排序_Java对象集合、对象数组如何排序?你需要知道这两种方式...

    一.引子 在比较Java对象时,正常情况下,我们只能使用==或!=进行比较,而不能使用>或者<这样的运算符. 那么问题来了,开发过程中我们经常要对多个对象排序,排序必然需要比较,那么如何实 ...

最新文章

  1. spring2.0和spring2.5及以上版本的jar包区别 spring jar 包详解
  2. Java中实现按字符串位数在前面补0
  3. PackageManagerService启动过程
  4. Valve开发校准软件,LCD屏也能与高端VR头显适配了
  5. Java面试题集合(比较实用)
  6. Powerful Sleep(神奇的睡眠-睡眠生物钟的秘密:如何睡得更少却睡得更好)阅读笔记...
  7. android界面的滑动切换功能
  8. 【20】java里的this和static
  9. 区块链开源框架 HyperLedger Fabric 学习思路分享
  10. MetadataReader、ClassMetadata、AnnotationMetadata的简单使用
  11. easypoi/easyExcel导出excel(xls,xlsx)后,文件打开错误或乱码的解决方法
  12. 一、Oracle11g简介
  13. 邮件服务器备案,关于企业邮箱域名备案事项通知
  14. 你了解资金盘吗?那孪生兄弟产品盘你知道吗?
  15. Linux用户层和内核文件读写
  16. 学习要有但行好事,莫问前程的心态
  17. 二.英语语法 - 并列句
  18. 回望过去,感觉现在的自己十分功利
  19. 安装python与编译工具vs code(中文版)和pycharm(中文版)
  20. WiFi共享精灵 - 不需路由器一键轻松把网线共享给手机、笔记本等同时无线上网_我是亲民_新浪博客...

热门文章

  1. Java周总结_mysql_jdbc
  2. java获取当前项目相对路径_怎样在JAVA文件中获取该项目的相对路径
  3. ARM-ASM汇编指令
  4. 中职学校计算机专业课程设置,浅谈中职学校计算机专业的定位与课程设置
  5. 一、Java并发编程之线程、synchronized
  6. 金仓数据库字段_技术干货 | 超实用!详解人大金仓MPP数据库并行查询技术
  7. java 并发 调优_阅读笔记一——java高并发的性能优化
  8. hibernate中的hql语句,字符串时间范围筛选处理
  9. python代码练习2
  10. 【Paper】【Compute Vision】Best Paper Awards in Computer Science (since 1996)