JAVA的sort用法详解(二维数组排序,List<>排序,lambada表达式,自定义类型排序)

目录

前言:

一维数组降序:

方法1.Comparator接口:

代码实现:

方法2.Collections.reverseOrder():

代码实现: 

二维数组排序:

代码如下:

List<>排序:

代码如下:

自定义类型比较排序:

按照年龄逆序排序:

按照姓名升序排序:

lambada表达式简写:

一维数组逆序代码:

二维数组排序代码:

List<>排序代码:

自定义类型排序:

结语:


前言:

由于最近刷一些比赛真题时,发现有一些题要先排序一下后面才能用贪心之类的算法解决,在比赛上面自己实现一个排序算法有点浪费时间(当然不是指冒泡插入之类的简单排序,太慢了😭),考虑到java中Arrays类中有sort方法我们可以引用sort来排序,升序简单那降序呢,一维数组会排序那二维数组和List<>呢? 本文章就是为了解决这些问题,希望对友友有所帮助。💕💕💕

我相信来看这个的一般都是有急用吧😭😭😭(作者曾经也是),如果很急的话直接看代码实现,直接模仿着写即可,其他的都是一些知识点的讲解。

要想使用sort排序,排序的对象必须实现comparable接口才行,由于Comparable不太灵活故本文章不做详细介绍。

一位数组的基本类型sort方法都能排序(升序)。

可以说的是一维数组降序和二维数组排序都是通过如下sort的重载方法即传入一个比较器(参数是泛型的不能是基本类型)。

一维数组降序:

声明:为了方便叙述下面采用int和Integer进行叙述其他类似。

经过多次尝试和查阅许多资料得出:要想把一维数组逆序如果是基本类型的话要把它变成包装类,

基本类型实现不了。

方法1.Comparator接口:

实现Comparator接口可以说是最常用的一种自定义排序操作了,它比Comparable更加灵活,想要根据什么比较直接自己实现就行,下面我们就开始对它的介绍💕:

Comparator是一个接口,既然接口那么我们实现它必须要重写它的抽象方法compare必须要重写这一个(这个接口只有这一个方法)

如果不实现就是出现如下错误。 

 

实现比较器Comparator接口,上面< T >代表这是一个泛型(如果对泛型还不是很了解的话也没关系我们可以先会用就行),注意:泛型只能接受类,所有的基本数据类型必须使用包装类!,这就代表了我们要实现一维数组的逆序必须要把基本类型换成其包装类才行。否则会报如下错误。

代码实现:

import java.util.Arrays;
import java.util.Comparator;
class cmp implements Comparator<Integer>{@Overridepublic int compare(Integer o1,Integer o2){return o2 - o1;}
}
public class Test1 {public static void main(String[] args) {Integer[] nums = {1,2,3,4,5};Arrays.sort(nums,new cmp());for(int i = 0;i < nums.length;i++){System.out.print(nums[i] + " ");}}
}

效果如下:

如果想要升序的话就o1 - o2.  

方法2.Collections.reverseOrder():

 这个我是从别人那里看到的,因为这个好像整洁一点故也把他写进来(还是推荐Comparator

),源码如下,我们可以看到其实是传入一个比较器(Comparator)。注意要importCollections这个类。其源代码如下图。

代码实现: 

import java.util.Arrays;
import java.util.Collections;
public class Main{public static void main(String[] args) {Integer[] nums = {1,2,3,4,5};Arrays.sort(nums, Collections.reverseOrder());for(int i = 0;i < nums.length;i++){System.out.print(nums[i] + " ");}}
}

 不过很可惜的是这样像int这样的基本类型还是不行🈚。

二维数组排序:

二维数组这里只介绍Comparator方法,这个是最常用的并且作者只会这个😭,如果有大佬补充的话非常感谢🙇‍

代码如下:

是不是非常神奇,这其实说明int[]在内部可能是把它当作类来看的。

import java.util.Arrays;
import java.util.Comparator;
class cmp implements Comparator<int[]> {@Overridepublic int compare(int[] o1,int[] o2){return o1[0] - o2[0];}
}
public class Main {public static void main(String[] args) {int[][] nums = {{1,7},{2,6},{3,9},{8,2},{2,5}};Arrays.sort(nums,new cmp());for(int i = 0;i < nums.length;i++){for(int j = 0;j < nums[i].length;j++) {System.out.print(nums[i][j] + " ");}System.out.println();}}
}

结果如下我们是按照一行的第一个元素进行排序,显然这样做我们的结果是对的😎😎😎 

相信到这里友友们是不是发现新大陆了呢,按照每行的第几个数组来排序就改对应的o1和o2的下标即可如果想要逆序的话只需把o1 - o2 改为 o2 - o1即可。

多维类似,因为用的比较少故这里不再展开☆*: .。. o(≧▽≦)o .。.:*☆。

List<>排序:

在刷力扣的友友应该有这方面的需求,这类题目一般都是深搜DFS和回溯,要你返回这样的类型或者题目给你这样的类型。不先排个序的话会非常麻烦😫😫😫。这个List排序和上面的数组排序类似,这里写下是因为可能有的友友不知道List类中本来就有个sort方法可以用来排序List<>.

下面图片来自List官方文档,要想排序List<>就要调用List类中的sort方法,万幸的是它也可以传入比较器这意味这通用性会更强。

要想实现List.sort()排序就要创建一个比较类cmp(名字随便),cmp实现Comparator接口,在接口中传入List<>中的数据类型,注意不是传入List<Integer>可能有的友友会这么认为,但这是错误的❌。

代码如下:

import java.util.Comparator;
import java.util.List;
import java.util.ArrayList;
class cmp implements Comparator<Integer>{@Overridepublic int compare(Integer o1, Integer o2) {return o1 - o2;}
}
public class Test1 {public static void main(String[] args) {List<Integer> ret = new ArrayList<>();ret.add(4);ret.add(3);ret.add(2);ret.add(1);ret.sort(new cmp());for(Integer x:ret){System.out.print(x + " ");}}
}

其运行结果如下:显然正确😎😎😎

自定义类型比较排序:

声明:为了方便叙述我们自定义一个Person类里面有int类型的年龄,String类型的姓名。

在更多情况下我们还是想直接用sort来排序自定义类型,下面我给出java对象比较的三种方式如下图:

覆写的方法说明
Object.equals因为所有类都是继承自Object的,所以直接覆写即可,不过只能比较相等与否。
Comparable.compareTo需要手动实现接口,侵入性比较强,但一旦实现,每次用该类都有顺序,属于内部顺序。
Comparator.compare需要实现一个比较器对象,对待比较类的侵入性弱,但对算法代码实现侵入性强。

equals不是用在sort中的,只是如果想要就自定义类型使用>,<,==,的话就必须要重写equals方法。

在自定义类中基本用的都是自己实现一个比较器故下面不讲Comparable(只能比较一个,后续如果要修改很麻烦不方便),都是使用Comparator。

由于本文章主要讲解自定义类型sort排序,其它的一些细节问题不过多描述还请见谅❤️。

如果直接用sort的话编译能通过但会报如下错误,右边为Person类。

按照年龄逆序排序:

代码如下:

import java.util.Arrays;
import java.util.Comparator;class Person{int age;String name;public Person(int age,String name){this.age = age;this.name = name;}@Overridepublic String toString() {return "Person{" +"age=" + age +", name='" + name + '\'' +'}';}
}
class cmp implements Comparator<Person>{public int compare(Person o1,Person o2){return o2.age - o1.age;}
}
public class Test2 {public static void main(String[] args) {Person person1 = new Person(1,"cc");Person person2 = new Person(3,"bb");Person person3 = new Person(2,"aa");Person[] array = new Person[3];array[0] = person1;array[1] = person2;array[2] = person3;Arrays.sort(array,new cmp());for(int i = 0;i < array.length;i++){System.out.println(array[i]);}}
}

效果如下:

之所以能println出来这样是因为我们在Person类中重写了toString方法。

升序就不用说了。

按照姓名升序排序:

为了使文章更加简洁下面只给出比较器,友友们自己替换一下即可。name是String类型要比较大小直接调用compareTo方法即可。

class cmp implements Comparator<Person>{public int compare(Person o1,Person o2){return o1.name.compareTo(o2.name);}
}

结果如下:

lambada表达式简写:

这个lambada表达式简写是我在看别人题解时看到的,说实话第一次看到有点震惊,如果对这个很熟悉的话用sort来实现各种排序将写的非常快。由于文章篇幅有限下面直接给出用法不解释原理,大家可以先模仿等后续学到lambada表达式就水到渠成了👍👍👍

下面是lambada的语法实在不想看的话可以跳过会用就行👌

Lambada表达式的语法:

基本语法: (parameters) -> expression 或 (parameters) ->{ statements}

Lambda表达式由三部分组成:

(1)paramaters:类似方法中的形参列表,这里的参数是函数式接口里的参数。这里的参数类型可以明确的声明也可不声明而由JVM隐含的推断。另外当只有一个推断类型时可以省略掉圆括号。

(2)->:可理解为“被用于”的意思。

(3)方法体:可以是表达式也可以是代码块,是函数式接口里方法的实现。代码块可返回一个值或者什么都不返回,这里的代码块等同于方法的方法体。如果是表达式,也可以返回一个值或者什么都不反回。

一维数组逆序代码:

public class Test4 {public static void main(String[] args) {Integer[] nums = {1,7,4,2,9,6,4};Arrays.sort(nums,(o1,o2)-> o2 - o1);for(int i = 0;i < nums.length;i++){System.out.print(nums[i] + " ");}}
}

结果如下:

二维数组排序代码:

import java.util.Arrays;
public class Test5 {public static void main(String[] args) {int[][] nums = {{1,3},{2,7},{6,7},{4,1},{3,9}};Arrays.sort(nums,(o1,o2)->o1[0] - o2[0]);for(int i = 0;i < nums.length;i++){for(int j = 0;j < nums[i].length;j++){System.out.print(nums[i][j] + " ");}System.out.println();}}
}

效果如下:

List<>排序代码:

import java.util.ArrayList;
import java.util.List;
public class Test6 {public static void main(String[] args) {List<Integer> ret = new ArrayList<>();ret.add(1);ret.add(2);ret.add(3);ret.add(4);ret.sort((o1,o2)->o2 - o1);for(Integer x:ret){System.out.print(x + " ");}}
}

 结果如下:

自定义类型排序:

这个有点多且上面代码给过了这里直接给图片啦!

到这已经把Java当中sort常用的排序已经全部给出,说实话整理出来还是挺不容易的😫😫😫,查阅资料等等这篇博客我整理了将近一周的时间希望对大家有所帮助❤️❤️❤️。

结语:

其实写博客不仅仅是为了教大家,同时这也有利于我巩固知识点,和做一个学习的总结,由于作者水平有限,对文章有任何问题还请指出,非常感谢。如果大家有所收获的话还请不要吝啬你们的点赞收藏和关注,这可以激励我写出更加优秀的文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/776140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ansible-1

Ansible是一款自动化运维、批量管理服务器的工具&#xff0c;批量系统配置、程序部署、运行命令等功能。基于Python开发&#xff0c;基于ssh进行管理&#xff0c;不需要在被管理端安装任何软件。Ansible在管理远程主机的时候&#xff0c;只有是通过各种模块进行操作的。 需要关…

Linux 注入依赖环境

文章目录 配置依赖程序安装 JDK安装 Tomcat安装 mysql 配置依赖程序 下面配置依赖程序都以CentOS为例。 安装 JDK 可以直接使用 yum(CentOS) 直接进行安装。 先搜索&#xff0c;确定软件包的完整名称。 yum list | grep jdk再进行安装 进行安装的时候一定要先确保处在“管理…

【详细讲解React 快速入门教程】

&#x1f525;博主&#xff1a;程序员不想YY啊&#x1f525; &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家&#x1f4ab; &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 &#x1f308;希望本文对您有所裨益&#xff0c;如有…

【C语言】strcmp 的使⽤和模拟实现

前言 这篇文章将要带我们去实现模拟一个strcmp函数 首先我们要知道strcmp函数的定义 strcmp()定义和用法 我们先看一下strcmp在cplusplus网站中的定义 链接: link int strcmp ( const char * str1, const char * str2 );比较两个字符串将 C 字符串 str1 与 C 字符串 str2 …

Java Stream API之reduce方法详解

Java 8引入的Stream API为Java开发者带来了函数式编程的风格&#xff0c;使得数据处理变得更加简洁和高效。在这众多的流操作中&#xff0c;reduce()方法是一个非常强大且灵活的工具&#xff0c;它可以将流中的元素组合起来&#xff0c;生成单一的汇总结果。本文旨在深入探讨re…

ajaxpro CVE-2021-23758 漏洞记录

1. 一般出现在asp.net的站点 打开页面&#xff0c;源代码会看到 类似/ajaxpro/gust_search,wlms.ashx路径 如果有源代码的话&#xff0c;copy aspx all.txt 去掉分号中间空格批量请求。 2. ajaxpro组件存在CVE-2021-23758漏洞&#xff0c;标有属性[AjaxPro.AjaxMethod]或[A…

openssl AF_ALG引擎使用

cmd AF_ALG是Linux提供的一种虚拟接口&#xff0c;用于访问内核中的加密算法。在Linux中&#xff0c;可以使用AF_ALG接口配合加密算法框架&#xff08;Crypto API&#xff09;来进行加密操作。 以下是一个使用AF_ALG和openssl进行加密操作的例子&#xff1a; # 加密 openssl…

C++ 内存泄漏-原因、避免、定位

大家好&#xff01;作为C/C开发人员&#xff0c;内存泄漏是最容易遇到的问题之一&#xff0c;这是由C/C语言的特性引起的。C/C语言与其他语言不同&#xff0c;需要开发者去申请和释放内存&#xff0c;即需要开发者去管理内存&#xff0c;如果内存使用不当&#xff0c;就容易造成…

smarteye server内置对多种第三方协议(28181/RTSP/RTMP)的输入、输出的支持

smarteye server内置支持了多种协议的输入转换、转换输出&#xff0c;包括GB28181、RTSP、RTMP等等。 目前smarteye server可支持的输入、输出的协议有&#xff1a;RTSP in/out, ONVIF in, RTMP in/out&#xff0c;GB28181 in/out。 常用的即smarteye server可作为国标28181…

最新海外投资理财源码 amazon多语言投资理财系统源码 区块链理财项目平台源码 共享充电宝系统

一款新UI的海外多语言刷单系统&#xff0c;支持后台在线添加订单派单、预约派单、余额宝等功能 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88949885 更多资源下载&#xff1a;关注我。

Unity生命周期函数(自己记忆用)

在Unity中&#xff0c;每个游戏对象&#xff08;GameObject&#xff09;都可以附加一个或多个脚本&#xff08;Script&#xff09;&#xff0c;这些脚本继承自MonoBehaviour类。MonoBehaviour类定义了一系列的生命周期函数&#xff0c;这些函数在游戏的不同阶段被自动调用&…

python模糊字符串匹配库fuzzywuzzy

一、概述 Python的fuzzywuzzy库是一个强大的模糊字符串匹配工具&#xff0c;基于Levenshtein距离算法&#xff0c;可用于处理文本相似度匹配任务。本文将深入探讨fuzzywuzzy库的各种功能和用法&#xff0c;结合详细的描述和丰富的示例代码&#xff0c;带领大家全面了解这个工具…

38. 单调递增的数字(力扣LeetCode)

文章目录 738. 单调递增的数字题目描述思路贪心算法代码逻辑梳理&#xff1a; 738. 单调递增的数字 题目描述 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&am…

LabVIEW单片机的废气再循环EGR检测系统

LabVIEW单片机的废气再循环EGR检测系统 实现了一种基于LabVIEW和STM32F103VET6单片机的EGR&#xff08;废气再循环&#xff09;检测系统&#xff0c;监测和控制船用二冲程柴油机的EGR运行状态。通过替代传统的NI采集卡&#xff0c;系统不仅降低了成本&#xff0c;同时也提升了数…

C++经典面试题目(七)

1、什么是引用&#xff1f;请解释引用的概念和用法。 当谈论引用时&#xff0c;指的是在 C 中的一种类型。引用提供了对变量的别名&#xff0c;它允许通过不同的名称访问同一个变量。引用在 C 中常用于函数参数传递、返回值传递和操作符重载等场景。 引用的概念和用法&#x…

SECFLOAT: Accurate Floating-Point meets Secure 2-Party Computation

2022 IEEE Symposium on Security and Privacy (SP) 目录 1.概述2.SECFLOAT设计2.1 为什么标准库不适合2PC?2.3 本文贡献2.2 SECFLOAT的设计2.2.1为什么它的设计可以解决问题&#xff1f;2.2.2实现 1.概述 问题&#xff1a; 密码学工作中使用的现有函数是不精确的&#xff0…

ROS2从入门到精通0-4:ROS2核心架构与常用指令大全

目录 0 专栏介绍1 ROS2核心架构1.1 工作空间1.2 功能包 2 ROS2常用指令2.1 功能包相关2.2 节点运行相关2.3 话题相关2.4 参数相关2.4 录制包、播放包相关2.5 服务相关2.6 动作相关2.7 生命周期相关 0 专栏介绍 本专栏旨在通过对ROS2的系统学习&#xff0c;掌握ROS2底层基本分布…

八道Python入门级题目及答案详解

前言 介绍Python作为一门流行的编程语言&#xff0c;易学易用的特点。强调通过练习题目来加深对Python语法和编程概念的理解。 题目一&#xff1a;计算两个数的和 描述&#xff1a;编写一个Python程序&#xff0c;计算两个数的和&#xff0c;并输出结果。举例&#xff1a;输…

DP4301-M无线模块一款SUB-1G无线收发模块

DP4301-M无线模块是一款低成本高效率工作于1GHz以内的收发模块&#xff0c;支持中国智能电无线 集抄标准470MHz~ 510MHz&#xff0c;兼容433MHz ISM/SRD频段均可使用。 此模块且前已经超大量应用于国标智能无线抄表及物联网自组网等双向数据传输系统方案&#xff0c;模 块具备的…

Mybatis-获取参数值的两种方式

1. ${ } 和 #{ } MyBatis获取参数值的两种方式&#xff1a;${ } 和 #{ } 对于初学者来说&#xff0c;理解MyBatis中获取参数值的两种方式——#{}和${}&#xff0c;关键在于明白它们如何影响SQL语句的构建以及为何在安全性、灵活性上有显著差异。下面我将用简单易懂的语言来解…