【Java】再看排序 —— 关于 Comparator 的用法

news/2024/10/17 10:36:16/

谈一个比较基础,又很常用的东西, Comparator 类,之前我写过一篇浅浅的关于这个的文章 ,今天再复盘一下这个问题,把它弄熟

ps: 本文中提供的代码,为了提高可读性都没用 lamdam 和 函数式编程 简化书写,大家平时用的时候,自己使用 IDEA 快捷键转化一下

一、 做什么

Comparator 类常作为 sorted() 方法的参数传递给 sorted 方法,用来解决给集合排序,自定义排序规则的问题 。

那从这个角度看,这个类肯定很常用了,因为我知道大家都不喜欢自己写排序方法,而且自己写的肯定还有性能优化问题,我们直接用 jdk 帮我们封装好的,就即简洁,又易于阅读 。

二、使用

1. 对 Array 数组类型进行排序

下面是 Arrays 类暴露给我们的排序方法 —— sorted

Stream<T> sorted(Comparator<? super T> comparator);

Comparator 接口暴露给我们以下两个方法给我们实现:

@FunctionalInterfaceint compare(T o1, T o2);boolean equals(Object obj);

还有以下几个静态方法,给我们直接用类名调用

(1)情况一 : 直接 new Comparator 对象,然后实现其 compare 方法进行排序

这种情况可以在 compare 内部定义好排序规则,看起来非常直观,通过在 compare 中写好逻辑代码,可以实现多种排序规则 。

        Integer[] a = {1, 2, 3, 0};// 对 a 按照逆序排序Integer[] a2 = Arrays.stream(a).sorted(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}}).toArray(new IntFunction<Integer[]>() {@Overridepublic Integer[] apply(int value) {return new Integer[value];}});

(2)情况二: 使用 Comparator 的静态方法,链式的添加排序规则

这种方式也可以随意定制排序规则,而且相对来说,代码的可读性更高,如下实例:

        Integer[] a1 = Arrays.stream(a).sorted(Comparator.comparing(new Function<Integer, Integer>() {@Overridepublic Integer apply(Integer integer) {return integer;}}).reversed()).toArray(new IntFunction<Integer[]>() {@Overridepublic Integer[] apply(int value) {return new Integer[value];}});

其提供了如下方法,供我们使用 : 其中 then 那一堆可以帮我们定义二级排序规则,也就是说第一级相等的时候,按照那个属性进行排序

请添加图片描述

2. 对 Collection 集合类型进行排序

总体思想和上面的差不多,只不过排序方法变成了 sort

下面是一个按照 People 类的身高进行排序的例子 :

    class Solution {class People {public String name;public int height;public People(String name, int height){this.name = name;this.height = height;}public int getHeight(){return height;}}public String[] sortPeople(String[] names, int[] heights) {List<People> list = new ArrayList<>(getPeopleList(names, heights));Collections.sort(list, Comparator.comparing(People :: getHeight).reversed());String[] ans = list.stream().map(people -> people.name).toArray(String[]::new);return ans;}public List<People> getPeopleList(String[] names, int[] heights){List<People> list = new ArrayList<>();for(int i=0; i<names.length; i++){People people = new People(names[i], heights[i]);list.add(people);}return list;}}

三、总结

这文章写的乱七八糟的,抱歉大家,我最近脑子比较乱,所以不总结都不行了,总结就以下两点:

  • 直接创建 Comparator 类实例, 然后重写 compare 方法定义排序规则
  • 使用 Comparator 静态方法进行排序,直接用类名调用进行排序,给方法传入相应的排序指标

http://www.ppmy.cn/news/51186.html

相关文章

生产mysql遇到kill不掉的sql的解决方法

一、问题描述 今天上线&#xff0c;生产mysql有个2700万数据的大表lt_integral_detail_info&#xff0c;准备给这个表加字段、加索引&#xff1b; 执行加字段加索引的命令比较费时&#xff0c;结果这时有人对这个表执行了多个select count(*)操作&#xff0c;导致直接把Navic…

Android修改头像之拍照、从相册选择、裁剪

手写一个修改头像的需求&#xff0c;头像图片支持手机拍照裁剪和从相册选择图片裁剪&#xff1b; 实现效果&#xff1a; 本节主要内容&#xff1a; 1&#xff09;头像修改对话框实现&#xff1b; 2&#xff09;调用系统相机拍照&#xff1b; 3&#xff09;自定义图片裁剪页…

信号量【Linux】

文章目录 1. POSIX信号量1.1 引入1.2 概念1.3 PV原语&#xff08;原理&#xff09;1.4 相关接口 2. 二进制信号量3. 基于环形队列的生产消费模式3.1 介绍3.2 为什么要使用环形队列3.3 环形队列的作用3.4 实现互斥和同步两个信号量框架生产和消费的逻辑完善环形队列1信号量完善环…

【打卡-Coggle竞赛学习2023年4月】图像检索与重复图像识别

#### 任务1&#xff1a;图像匹配与检索 图像相似度 图像相似度是用于度量两幅图像之间相似程度的指标。图像相似度可以基于像素级别的相似度或者基于特征匹配的相似度来计算。像素级别的相似度通常是基于两幅图像的像素值来计算的&#xff0c;包括均方误差、结构相似性指数&a…

JAVA Future类详解及Thread线程是如何运行Future类的

一、Future基本介绍 Future(java.util.concurrent Interface Future<V>)表示异步计算的结果。Future接口提供了检查计算是否完成、检查计算是否被取消、等待计算完成并获取计算结果等方法。 在并发编程中&#xff0c;我们经常用到非阻塞的模型&#xff0c;但继承thread类…

SpringBoot入门篇

SpringBoot入门 一、Maven项目二、HTTP协议2.1、协议概述2.2、请求协议2.3、响应协议2.3、协议解析 三、Web服务器 -TomCat3.1、Tomcat简介3.2、Tomcat使用3.3、内嵌Tomcat 四、请求响应4.1、请求4.1.1、postman4.1.2、简单参数4.1.3、实体参数4.1.4、数组集合参数4.1.5、日期参…

【FPGA-DSP】第九期:音频信号处理

从本文开始将记录一些简单的音频信号处理算法在System Generator中的实现方法。本文将介绍如何搭建音频信号的采集与输出模型。 音频信号属于一维信号&#xff0c;一些基本概念如下&#xff1a; 采样频率&#xff1a;根据奈奎斯特采样定理&#xff0c;采样频率Fs应该不低于声…

Nmap学习简记

Nmap主机发现 nmap -sn CIDR 对该网络中的所有主机进行ip扫描&#xff0c;以此来发现网络主机存活。 Nmap主机发现结果输出 nmap -sn CIDR -oX test.xml 将扫描结果输出到test.xml文件中方便以后使用。 Nmap端口探测技巧 nmap -p80 DNS 对某个端口进行探测 nmap -p80,…