Java 排序

Java 中经常需要对一个列表进行排序,列表中可能是基本数据类型,也可能是自定义对象,对于自定义对象的排序我们可能只想按照其某个属性排序,甚至多种条件组合对其排序,这些都可以借助于 Comparator 接口来实现。

基本数据类型集合排序

基本数据类型的排序比较简单,一般使用 JDK 本身提供了默认的比较器 naturalOrder、reverseOrder 等就可以实现基本的一些排序需求。

List numbers = Lists.newArrayList();

numbers.add(new Integer(5));

numbers.add(new Integer(15));

numbers.add(new Integer(53));

numbers.add(new Integer(35));

numbers.add(new Integer(16));

System.out.println("input list is " + numbers);

numbers.sort(Comparator.naturalOrder());

System.out.println("after sort is " + numbers);

numbers.sort(Comparator.reverseOrder());

System.out.println("after reverse sort is " + numbers);

自定义对象集合排序

自定义对象的排序需要对象本身提供比较的规则,最常见的方式是实现Comparable接口,另外还可以实现Comparator接口达到多种规则排序的目的,这里重点要介绍一下 JDK8 中对排序的一些改进实现。

传统方法1-实现Comparable接口

这是最传统的实现方法,需要实体类实现额外的接口,代码侵入比较严重,并且写法不够灵活,不能实现多种排序方式,不建议使用。

class Student implements Comparable{

private String name;

private int score;

private int age;

//构造方法 ...

//get set 方法 ...

//实现Comparable的compareTo方法

@Override

public int compareTo(Student stu){

// TODO Auto-generated method stub

return this.getScore()-stu.getScore();

}

public static void main(String [] args){

List list = new ArrayList();

list.add(new Student("张三",89,20));

list.add(new Student("李四",60,21));

list.add(new Student("路人",99,15));

Collections.sort(list);

for(Student stu : list){

System.out.println(stu.toString());

}

}

}

传统方法2-实现Comparator接口

这种写法代码侵入较小,但需要为排序单独创建实现了 Comparator 接口的类,相较于上一种方式稍微有所改进。

//按照年龄排序的比较器

//sortAge实现Comparator接口

class sortAge implements Comparator{

@Override

//实现Comparator的compare方法

public int compare(Student stu1, Student stu2){

// TODO Auto-generated method stub

return stu1.getAge()-stu2.getAge();

}

}

//按照名字排序的比较器

//sortAge实现Comparator接口

class sortName implements Comparator{

@Override

//实现Comparator的compare方法

public int compare(Student stu1, Student stu2){

// TODO Auto-generated method stub

return stu1.getName().compareTo(stu2.getName());

}

}

public static void main(String [] args){

List list = new ArrayList();

list.add(new Student("A",89,20));

list.add(new Student("C",60,21));

list.add(new Student("B",99,15));

//按照年龄排序

Collections.sort(list, new sortAge());

//按照名字排序

Collections.sort(list, new sortName());

//匿名内部类排序

Collections.sort(list, new Comparator() {

public int compare(Student p1, Student p2){

return Integer.valueOf(p1.getAge()).compareTo(p2.getAge());

}

});

}

JDK8 的各种实现方式

利用 JDK8 提供的新特性,可以使得排序写法更加简洁优雅,强烈推荐使用。

//自定义类列表

List persons = Lists.newArrayList();

Person p1 = new Person("zhang",25,52000);

Person p2 = new Person("wang",35,32000);

Person p3 = new Person("chen",29,27000);

persons.add(p1);

persons.add(p2);

persons.add(p3);

System.out.println("---使用JDK8方式对自定义对象排序---");

System.out.println("origin list: " + persons);

//年龄顺序

Collections.sort(persons, Comparator.comparing(Person::getAge)); //这里使用了JDK8的方法传递特性

System.out.println("age sort: " + persons);

//薪水顺序

Collections.sort(persons, Comparator.comparing(Person::getSalary));

System.out.println("salary sort: " + persons);

//薪水逆序

Collections.sort(persons, Comparator.comparing(Person::getSalary).reversed());

System.out.println("salary reversed sort: " + persons);

/*使用静态方法引用方式*/

//1. 需要在Person类中定义一个静态的比较方法compareBySalaryThenAge

public static int compareBySalaryThenAge(Person h1, Person h2){

if (h1.getSalary().equals(h2.getSalary())) {

return Integer.compare(h1.getAge(), h2.getAge());

}

return h1.getSalary().compareTo(h2.getSalary());

}

//2. 是用静态引用进行比较

persons.sort(Person::compareBySalaryThenAge); //这里就是典型的行为参数化,将函数当做参数传入,这也是lambda表达式的本质

System.out.println("static reference sort: " + persons);

/*使用lambda表达式*/

Comparator comparator = (h1, h2) -> h1.getAge().compareTo(h2.getAge());

persons.sort(comparator);

persons.sort(comparator.reversed());

/*上面可以简写为如下形式*/

persons.sort((Person h1, Person h2) -> h1.getAge().compareTo(h2.getAge()));

/*统计年龄大于25的人数,使用 stream 一句搞定*/

long cnt = persons.stream().filter(person -> person.getAge()>25).count();

System.out.println(cnt);

Copyright © jverson.com 2019 all right reserved,powered by Gitbook20:26:35

java中sort函数comparator的使用_Comparator 与排序相关推荐

  1. java中sort函数comparator的使用_Java Comparator comparingInt()用法及代码示例

    compareInt(java.util.function.ToIntFunction)方法接受一个函数作为参数,从类型T中提取一个int排序键,并返回一个与该排序键进行比较的Comparator.返 ...

  2. java中sort函数的使用

    java中sort函数的使用 写在前面 sort函数的基本格式 第一种基本格式 第二种基本格式 第三种基本格式cmp 函数的基本格式 写在前面 想必大家都知道C++里面的sort用过的都知道这个函数是 ...

  3. java的sort函数中Comparator的简单使用

    java中sort函数的用法 ①使用Array.sort(a,m,n) . Arrays.sort(a),其中a表示的需要排序的数组,m表示的是开始排序的下标,排序的时候包括该下标的元素,n表示的是结 ...

  4. Java中Comparable和Comparator接口区别分析

    本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧. Comparable 简介 Comp ...

  5. java comparator相等_详解Java中Comparable和Comparator接口的区别

    详解Java中Comparable和Comparator接口的区别 发布于 2020-7-20| 复制链接 摘记: 详解Java中Comparable和Comparator接口的区别本文要来详细分析一 ...

  6. java compareto方法怎么排序的_深入理解Java中Comparable和Comparator排序

    本文有牛旦教育原创,头条首发,转载注明来源. 如何为需要的排序算法选择正确的接口?通过本文的分析讲解,我们会找到答案参考答案. 程序员经常需要将数据库中的元素排序为集合.数组或映射.在Java中,我们 ...

  7. [CodeForces 892A] Greed (Java中sort实现从大到小排序)

    题目链接:http://codeforces.com/problemset/problem/892/A 具体的Java 中 sort实现降序排序:https://www.cnblogs.com/you ...

  8. 简单介绍Java中Comparable和Comparator

    转载自 简单介绍Java中Comparable和Comparator Comparable 和 Comparator是Java核心API提供的两个接口,从它们的名字中,我们大致可以猜到它们用来做对象之 ...

  9. Java中sort实现降序排序

    Java中sort实现降序排序 利用Collections的reverseOrder方法: import java.util.Arrays; import java.util.Collections; ...

最新文章

  1. 常用python工具类代码总结
  2. Docker + FastDFS + Spring Boot 一键式搭建分布式文件服务器
  3. 嵌入式学习笔记--网络打流补充笔记(iperf3应用)
  4. QTableWidget控件总结
  5. matlab figure函数的用法
  6. 数据中心采用液体冷却的障碍
  7. 求给定数组子数组中最接近0的和
  8. ORACLE sqlplus set 命令速查
  9. 1、Canvas的基本用法
  10. Pyhton随机生成测试数据模块faker
  11. 氩焊机器人编程_谈一谈铝合金的脉冲MIG焊
  12. html中怎么给网页添加音乐播放器,怎么给网站或网页添加音乐
  13. GPS地图坐标转百度地图坐标
  14. 项目管理中如何如何进行风险控制
  15. Qlikview脚本生成日历表
  16. zynqsd的读写数据_数据存储结构图 - Zynq7000 FPGA的高速信号采集处理平台的设计搭建以及后续拓展...
  17. php实现简单的留言板
  18. 京东2019春招商业分析试卷[题目整理]
  19. T-SQL基本语句总结(SQL Server版)
  20. 小米扫地机器人换了边刷很响_扫地机器人边刷常见问题解决办法,故障排除

热门文章

  1. vue scss 一键更换主题色,字体等页面等页面大体样式
  2. 京东方HR270WU1-200工业液晶屏规格参数 27寸医疗液晶屏
  3. 编写自己的 WordPress 模板
  4. 华为鸿蒙ota真机测试,华为发布鸿蒙2.0手机开发者测试版!华为老手机可申请公测...
  5. 漫画:一招学会TCP的三次握手和四次挥手
  6. 怎么清晰分辨切点与切面
  7. Ubuntu14.04 ftp服务安装配置
  8. 蓝牙耳机品牌性价比排行,2023年性价比高的蓝牙耳机
  9. vue elementUI中指定div加载状态
  10. redis启动、获取密码及修改密码