java中sort函数comparator的使用_Comparator 与排序
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 与排序相关推荐
- java中sort函数comparator的使用_Java Comparator comparingInt()用法及代码示例
compareInt(java.util.function.ToIntFunction)方法接受一个函数作为参数,从类型T中提取一个int排序键,并返回一个与该排序键进行比较的Comparator.返 ...
- java中sort函数的使用
java中sort函数的使用 写在前面 sort函数的基本格式 第一种基本格式 第二种基本格式 第三种基本格式cmp 函数的基本格式 写在前面 想必大家都知道C++里面的sort用过的都知道这个函数是 ...
- java的sort函数中Comparator的简单使用
java中sort函数的用法 ①使用Array.sort(a,m,n) . Arrays.sort(a),其中a表示的需要排序的数组,m表示的是开始排序的下标,排序的时候包括该下标的元素,n表示的是结 ...
- Java中Comparable和Comparator接口区别分析
本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧. Comparable 简介 Comp ...
- java comparator相等_详解Java中Comparable和Comparator接口的区别
详解Java中Comparable和Comparator接口的区别 发布于 2020-7-20| 复制链接 摘记: 详解Java中Comparable和Comparator接口的区别本文要来详细分析一 ...
- java compareto方法怎么排序的_深入理解Java中Comparable和Comparator排序
本文有牛旦教育原创,头条首发,转载注明来源. 如何为需要的排序算法选择正确的接口?通过本文的分析讲解,我们会找到答案参考答案. 程序员经常需要将数据库中的元素排序为集合.数组或映射.在Java中,我们 ...
- [CodeForces 892A] Greed (Java中sort实现从大到小排序)
题目链接:http://codeforces.com/problemset/problem/892/A 具体的Java 中 sort实现降序排序:https://www.cnblogs.com/you ...
- 简单介绍Java中Comparable和Comparator
转载自 简单介绍Java中Comparable和Comparator Comparable 和 Comparator是Java核心API提供的两个接口,从它们的名字中,我们大致可以猜到它们用来做对象之 ...
- Java中sort实现降序排序
Java中sort实现降序排序 利用Collections的reverseOrder方法: import java.util.Arrays; import java.util.Collections; ...
最新文章
- 常用python工具类代码总结
- Docker + FastDFS + Spring Boot 一键式搭建分布式文件服务器
- 嵌入式学习笔记--网络打流补充笔记(iperf3应用)
- QTableWidget控件总结
- matlab figure函数的用法
- 数据中心采用液体冷却的障碍
- 求给定数组子数组中最接近0的和
- ORACLE sqlplus set 命令速查
- 1、Canvas的基本用法
- Pyhton随机生成测试数据模块faker
- 氩焊机器人编程_谈一谈铝合金的脉冲MIG焊
- html中怎么给网页添加音乐播放器,怎么给网站或网页添加音乐
- GPS地图坐标转百度地图坐标
- 项目管理中如何如何进行风险控制
- Qlikview脚本生成日历表
- zynqsd的读写数据_数据存储结构图 - Zynq7000 FPGA的高速信号采集处理平台的设计搭建以及后续拓展...
- php实现简单的留言板
- 京东2019春招商业分析试卷[题目整理]
- T-SQL基本语句总结(SQL Server版)
- 小米扫地机器人换了边刷很响_扫地机器人边刷常见问题解决办法,故障排除