概述

List集合有两大排序方式,分别为自然排序和自定义排序。
使用自然排序,需要元素类达到某种要求。
使用自定义排序,就是在需要排序的时候才传入排序规则。

自然排序

  • 自然排序是 Collections.sort 方法,只带一个参数,参数为List集合。
  • 默认能直接使用自然排序的,有基本数据类型的包装类型、String类型等等。
  • 数字类型的自然排序顺序固定为从小到大。
public static void main(String[] args) {List<Integer> list = new ArrayList();list.add(2);list.add(1);list.add(3);Collections.sort(list);System.out.println(list);// 输出:[1, 2, 3]
}
  • 为什么那些类型能用于自然排序?因为它们都有一个特点,就是实现了 Comparable<E> 接口的 compareTo 方法。
  • 该方法的使用意义是让自身对象与另一个对象进行某方面的比较大小,用前者减去后者,返回正数则认为是前者的更大,返回负数则认为前者的更小。

下面我们来自定义一个类,让它实现该接口的方法。

public class Person implements Comparable {public Person(int age) { this.age = age; }private int age;public int getAge() { return age; }public void setAge(int age) { this.age = age; }@Overridepublic String toString() { return "Person{" + "age=" + age + '}'; }@Overridepublic int compareTo(Object o) {return age - ((Person) o).getAge();}
}

尝试使用一下:

public static void main(String[] args) {List<Person> list = new ArrayList();list.add(new Person(18));list.add(new Person(30));list.add(new Person(25));Collections.sort(list);System.out.println(list);// 输出:[Person{age=18}, Person{age=25}, Person{age=30}]
}

自定义排序

先重新定义一下Person类,让Person类本身与排序无关。

public class Person {public Person(int age) { this.age = age; }private int age;public int getAge() { return age; }public void setAge(int age) { this.age = age; }@Overridepublic String toString() { return "Person{" + "age=" + age + '}'; }
}
  • 自定义排序同样也是 Collections.sort 方法,但是要多一个参数,该参数要实现 Comparator<E> 接口的 compare 方法。
  • 自定义排序的比较与自然排序的比较,它们的意义是相似。

为了方便,直接使用匿名内部类:

public static void main(String[] args) {List<Person> list = new ArrayList();list.add(new Person(18));list.add(new Person(30));list.add(new Person(25));Collections.sort(list, new Comparator<Person>() {@Overridepublic int compare(Person o1, Person o2) {return o1.getAge() - o2.getAge();}});System.out.println(list);// 输出:[Person{age=18}, Person{age=25}, Person{age=30}]
}

然后可以简单化为Lambda表达式:

public static void main(String[] args) {List<Person> list = new ArrayList();list.add(new Person(18));list.add(new Person(30));list.add(new Person(25));Collections.sort(list, (o1, o2) -> o1.getAge() - o2.getAge());System.out.println(list);// 输出:[Person{age=18}, Person{age=25}, Person{age=30}]
}

还能继续精简为方法引用:

public static void main(String[] args) {List<Person> list = new ArrayList();list.add(new Person(18));list.add(new Person(30));list.add(new Person(25));Collections.sort(list, Comparator.comparingInt(Person::getAge));System.out.println(list);// 输出:[Person{age=18}, Person{age=25}, Person{age=30}]
}

Java:详解List集合的排序功能相关推荐

  1. JavaSE学习笔记 详解Set集合中实现类:LinkedHashSet以及TreeSet

    详解Set集合中实现类:LinkedHashSet以及TreeSet 1.LinkedHashSet概述 2.TreeSet概述 2.1 自然排序 2.1.1 TreeSet存储常见引用数据类型 2. ...

  2. java8编程开发入门 李兴华_李兴华系列--JAVA详解视频(jdk1.8)及项目实战教程

    李兴华系列--JAVA详解视频教程(jdk1.8)有源码+文档01_<Oracle从入门到精通> 02_<Java8编程入门> 03_<Java8面向对象编程> 0 ...

  3. android动态贴纸实现原理,人脸动态贴纸sdk算法详解,人脸动态贴纸功能如何实现...

    原标题:人脸动态贴纸sdk算法详解,人脸动态贴纸功能如何实现 泛娱乐行业在互联网领域中发展趋势逐渐增强,而直播.短视频.视频社交等作为头部产品受到了众多用户的关注和喜爱.为了能够更好的满足用户体验,众 ...

  4. Java详解剑指offer面试题50--第一个只出现一次的字符

    Java详解剑指offer面试题50–第一个只出现一次的字符 找出字符串中找出第一个只出现一次的字符,比如输入"abacceff",则输出'b' 要想知道某个字符是不是只出现了一次 ...

  5. 十大经典排序算法详解(三)-堆排序,计数排序,桶排序,基数排序

    养成习惯,先赞后看!!! 你的点赞与关注真的对我非常有帮助.如果可以的话,动动手指,一键三连吧!!! 十大经典排序算法-堆排序,计数排序,桶排序,基数排序 前言 这是十大经典排序算法详解的最后一篇了. ...

  6. java项目斗地主介绍_详解java_ 集合综合案例:斗地主

    案例介绍 按照斗地主的规则,完成洗牌发牌的动作. 具体规则: 使用54张牌打乱顺序,三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌. 案例分析 1.准备牌: 牌可以设计为一个Array ...

  7. java集合详解和集合面试题目

    一.集合与数组 数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用. ...

  8. java list详解_java集合List解析

    作为一个Developer,Java集合类是我们在工作中运用最多的.最频繁的类.相比于数组(Array)来说,集合类的长度可变,更加适合于现代开发需求: Java集合就像一个容器,可以存储任何类型的数 ...

  9. JAVA SE学习day_12:集合的排序、队列、栈结构

    一.集合的排序 1.1 集合的排序 集合的工具类java.util.Collections提供了一个静态方法sort,可以对List集合 进行自然排序,即:从小到大 除了自然排序之外还有反转.乱序方法 ...

  10. 计算机刷新的作用,图文详解Win8重置和刷新功能:超强自我治愈

    直接自愈,Windows8出故障之后,伴随着重置和刷新两大新功能,世上无难事了啊.微软Windows8团队今日在官方博客详细向用户解释Win8的重置和刷新PC功能,将可一键复位系统到最佳状态.视频演示 ...

最新文章

  1. 20年的人工智能设计总结:向产品中注入人工智能的指南
  2. GNU make manual 翻译( 一百一十九)
  3. 配置开发ExtJS环境
  4. Linux内核中的IPSEC实现(7)
  5. python带我起飞_【有书共读】python带我起飞读书笔记05
  6. 数据库密码加密公用秘要生成器,数据库密码加密解密入口
  7. 使用COE脚本绑定SQL Profile
  8. mysql 12安装教程下载_MySQL 8.0.12.0安装教程
  9. ubuntu1804系统设置在哪里_Ubuntu1804(Server 版) 安装及使用
  10. angular是MVC模式还是MVVM架构模式
  11. 【Linux】第一章 整合 JDK 和 MariaDB(附 Linux 基本命令)
  12. Java Servlet ServletContext
  13. jQuery实现的测试答题功能
  14. 冷知识 —— 物种大交换
  15. jquery系列教程3-DOM操作全解
  16. Bzoj3065 带插入区间K小值
  17. 苹果Mac智能的Python集成开发环境:PyCharm Pro
  18. 拓端tecdat|R语言提取时间序列的周期性成分应用EMD,小波滤波器,Baxter过滤器等
  19. JavaEE学习总结(十四)— 人工智能微博
  20. AlphaGo Zero算法简介

热门文章

  1. win10保护色设置及还原
  2. 市场上硬杠,技术上死磕,华为如何跨越操作系统黑洞
  3. 计算机操作系统(第四版) 汤小丹 配套资源
  4. RH850/F1x的PWM-Diag功能分析
  5. TDD测试驱动开发案例【水货】
  6. ue编辑器漏洞_UEditor编辑器任意文件上传漏洞分析
  7. mysql 中的split函数_mysql中split函数
  8. 台式电脑设置同时访问内外网
  9. 网络安全审计系统产品竞品分析
  10. html语言字体为隶书,css如何设置隶书字体库