Java Sort 方法的使用(包含Arrays.sort(),Collections.sort()以及Comparable,Comparator的使用 )

2024-05-31 13:12

本文主要是介绍Java Sort 方法的使用(包含Arrays.sort(),Collections.sort()以及Comparable,Comparator的使用 ),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

Comparable && Comparator的使用:

Comparable:

Comparator:

Arrays.sort()的使用:

升序排序:

 降序排序:

 自定义排序方法:


在日常的刷题或开发中,很多时候我们需要对数据进行排序,以达到我们的预期效果的作用。那么这些排序方法具体怎么实现和使用呢?本文就来好好缕一缕,总结一下这些方法:

Comparable && Comparator的使用:

Comparable:

当我们对类中的对象进行比较时,要保证对象时可比较的,这时我们就需要用到Comparable 或 Comparator接口,然后重写里面的compareTo()方法。假设我们有一个学生类,默认需要按照学生的年龄age排序,具体实现如下:

class Student implements Comparable<Student>{private int id;private int age;private String name;public Student(int id, int age, String name) {this.id = id;this.age = age;this.name = name;}@Overridepublic int compareTo(Student o) {//降序//return o.age - this.age;//升序return this.age - o.age;}public int getId() {return id;}public void setId(int id) {this.id = id;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Student{" +"id=" + id +", age=" + age +", name='" + name + '\'' +'}';}}

这里说一下  public int compareTo(Student o) 方法,它返回三种 int 类型的值: 负整数 ,正整数:

返回值含义
正整数当前对象的值 > 比较对象的值,升序排序
当前对象的值  比较对象的值,不变
负整数当前对象的值 < 比较对象的值,降序排序

测试:

public class SortTest {public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student(103,25,"关羽"));list.add(new Student(104,21,"张飞"));list.add(new Student(108,18,"刘备"));list.add(new Student(101,32,"袁绍"));list.add(new Student(109,36,"赵云"));list.add(new Student(103,16,"曹操"));System.out.println("排序前:");for(Student student : list){System.out.println(student.toString());}System.out.println("默认排序后:");Collections.sort(list);for(Student student : list){System.out.println(student.toString());}}
}

运行结果:

排序前:
Student{id=103, age=25, name='关羽'}
Student{id=104, age=21, name='张飞'}
Student{id=108, age=18, name='刘备'}
Student{id=101, age=32, name='袁绍'}
Student{id=109, age=36, name='赵云'}
Student{id=103, age=16, name='曹操'}
默认排序后:
Student{id=103, age=16, name='曹操'}
Student{id=108, age=18, name='刘备'}
Student{id=104, age=21, name='张飞'}
Student{id=103, age=25, name='关羽'}
Student{id=101, age=32, name='袁绍'}
Student{id=109, age=36, name='赵云'}

Comparator:

Comparable的两种使用方法:

  • Collections.sort(list,Comparator<T>);
  • list.sort(Comparator<T>);

这个时候需求又来了,默认是用 age 排序,但是有的时候需要用 id 来排序怎么办? 这个时候比较器 :Comparator 就排上用场了:

 //自定义排序:使用匿名内部类,实现Comparator接口,重写compare方法Collections.sort(list, new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {return o1.getId() - o2.getId();}});//自定义排序2list.sort(new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {return o1.getId() - o2.getId();}});

compare(Student o1, Student o2) 方法的返回值跟 Comparable<> 接口的 compareTo(Student o) 方法返回值意思相同 

 运行结果:

自定义ID排序后:
Student{id=101, age=32, name='袁绍'}
Student{id=103, age=16, name='曹操'}
Student{id=103, age=25, name='关羽'}
Student{id=104, age=21, name='张飞'}
Student{id=108, age=18, name='刘备'}
Student{id=109, age=36, name='赵云'}

源码:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;class Student implements Comparable<Student>{private int id;private int age;private String name;public Student(int id, int age, String name) {this.id = id;this.age = age;this.name = name;}@Overridepublic int compareTo(Student o) {//降序//return o.age - this.age;//升序return this.age - o.age;}public int getId() {return id;}public void setId(int id) {this.id = id;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Student{" +"id=" + id +", age=" + age +", name='" + name + '\'' +'}';}}public class SortTest {public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student(103,25,"关羽"));list.add(new Student(104,21,"张飞"));list.add(new Student(108,18,"刘备"));list.add(new Student(101,32,"袁绍"));list.add(new Student(109,36,"赵云"));list.add(new Student(103,16,"曹操"));System.out.println("排序前:");for(Student student : list){System.out.println(student.toString());}System.out.println("默认排序后:");Collections.sort(list);for(Student student : list){System.out.println(student.toString());}//自定义排序:使用匿名内部类,实现Comparator接口,重写compare方法Collections.sort(list, new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {return o1.getId() - o2.getId();}});System.out.println("自定义ID排序后:");for(Student student : list){System.out.println(student.toString());}//自定义排序2list.sort(new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {return o1.getId() - o2.getId();}});}
}

Arrays.sort()的使用:

升序排序:

1.正常排序一个数组:Arrays.sort(int [] a);

我们看一下源码:

   public static void sort(int[] a) {DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);}

本质上还是用到了快排,同时默认时从小到大进行排序的,具体实现:

public static void main(String[] args) {//1.Arrays.sort(int[] a)  默认从小到达排序int[] a =  new int[]{10,2,7,8,9,15,7};System.out.println("默认时从小到大排序:");Arrays.sort(a);for(int x : a) System.out.print(x + " ");}

运行结果:

默认时从小到大排序:
2 7 7 8 9 10 15 

 2.在一定区间内排序数组:Arrays.sort(int[] a, int fromIndex, int toIndex)

->规则为从fromIndex<= a数组 <toIndex,左闭右开

   public static void main(String[] args) {//2.Arrays.sort(int[] a, int fromIndex, int toIndex)//规则为从fromIndex<= a数组 <toIndexint[] a = new int[]{2,5,4,1,19,3,2};Arrays.sort(a,1,4);for(int x : a) System.out.print(x + " ");}

 降序排序:

实现方法:Collections.reverseOrder()

public static <T> void sort(T[] a,int fromIndex, int toIndex,  Comparator<? super T> c)

要实现降序排序,得通过包装类型的数组来实现,基本数据类型数组是不行的:

正确用法:

 //2.java自带的Collections.reverseOrder() 降序排序数组System.out.println("java自带的Collections.reverseOrder():");Integer[] integers = new Integer[]{10, 293, 35, 24, 64, 56};Arrays.sort(integers, Collections.reverseOrder());for (Integer integer : integers) System.out.print(integer + " ");

 运行结果:

java自带的Collections.reverseOrder():
293 64 56 35 24 10 

 自定义排序方法:

自定义排序方法,需要实现java.util.Comparetor 接口中的compare方法
//3.自定义排序方法,实现java.util.Comparetor 接口中的compare方法Integer[] integers2 = new Integer[]{10, 293, 35, 24, 64, 56};Arrays.sort(integers2, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2.compareTo(o1);}});System.out.println("自定义排序方法:");for (int x : integers2) System.out.print(x + " ");

运行结果:

自定义排序方法:
293 64 56 35 24 10 

 同时,我们可以用lambda表达是简化书写:

 //4.lambda表达式简化书写Integer[] integers3 = new Integer[]{10, 293, 35, 24, 64, 56};Arrays.sort(integers3, (o1, o2) -> {return o2 - o1;});System.out.println("lambda表达式简化书写:");for (int x : integers3) System.out.print(x + " ");

运行结果:

lambda表达式简化书写:
293 64 56 35 24 10 

源码:

import java.util.*;
public class sortTest {public static void main1(String[] args) {//1.Arrays.sort(int[] a)  默认从小到达排序int[] a =  new int[]{10,2,7,8,9,15,7};System.out.println("默认时从小到大排序:");Arrays.sort(a);for(int x : a) System.out.print(x + " ");}public static void main2(String[] args) {//2.Arrays.sort(int[] a, int fromIndex, int toIndex)//规则为从fromIndex<= a数组 <toIndexint[] a = new int[]{2,5,4,1,19,3,2};Arrays.sort(a,1,4);for(int x : a) System.out.print(x + " ");}public static void main3(String[] args) {/* //1.实现降序排序,基本的数据类型数组是不行的int[] a = new int[]{10,293,35,24,64,56};Arrays.sort(a,Collections.reverseOrder());for(int x : a) System.out.println(x + " ");*///2.java自带的Collections.reverseOrder() 降序排序数组System.out.println("java自带的Collections.reverseOrder():");Integer[] integers = new Integer[]{10, 293, 35, 24, 64, 56};Arrays.sort(integers, Collections.reverseOrder());for (Integer integer : integers) System.out.print(integer + " ");System.out.println();System.out.println("===================================");//3.自定义排序方法,实现java.util.Comparetor 接口中的compare方法Integer[] integers2 = new Integer[]{10, 293, 35, 24, 64, 56};Arrays.sort(integers2, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2.compareTo(o1);}});System.out.println("自定义排序方法:");for (int x : integers2) System.out.print(x + " ");System.out.println();System.out.println("===================================");//4.lambda表达式简化书写Integer[] integers3 = new Integer[]{10, 293, 35, 24, 64, 56};Arrays.sort(integers3, (o1, o2) -> {return o2 - o1;});System.out.println("lambda表达式简化书写:");for (int x : integers3) System.out.print(x + " ");}
}

 补充,二维数组的排序:通过实现Comparator接口来自定义排序二维数组,以下面为例:

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 Sort {public static void main123(String[] args) {int[][] res = new int[][]{{3,6,7,8},{2,3,65,7},{1,4,5,78},{6,1,2,4}};//自定义排序二维数组,这里是按照每行第一个数字进行排序Arrays.sort(res,new Cmp());for(int i = 0;i < res.length;i++){for(int j = 0;j < res[0].length;j++){System.out.print(res[i][j] + " ");}System.out.println();}}
}

运行结果:

好啦~本文到这里也是接近尾声了,希望有帮助到你,整理不易,希望多多三联支持呀~

结语: 写博客不仅仅是为了分享学习经历,同时这也有利于我巩固知识点,总结该知识点,由于作者水平有限,对文章有任何问题的还请指出,接受大家的批评,让我改进。同时也希望读者们不吝啬你们的点赞+收藏+关注,你们的鼓励是我创作的最大动力!

这篇关于Java Sort 方法的使用(包含Arrays.sort(),Collections.sort()以及Comparable,Comparator的使用 )的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1018026

相关文章

SpringBoot简单整合ElasticSearch实践

《SpringBoot简单整合ElasticSearch实践》Elasticsearch支持结构化和非结构化数据检索,通过索引创建和倒排索引文档,提高搜索效率,它基于Lucene封装,分为索引库、类型... 目录一:ElasticSearch支持对结构化和非结构化的数据进行检索二:ES的核心概念Index:

Python数据验证神器Pydantic库的使用和实践中的避坑指南

《Python数据验证神器Pydantic库的使用和实践中的避坑指南》Pydantic是一个用于数据验证和设置的库,可以显著简化API接口开发,文章通过一个实际案例,展示了Pydantic如何在生产环... 目录1️⃣ 崩溃时刻:当你的API接口又双叒崩了!2️⃣ 神兵天降:3行代码解决验证难题3️⃣ 深度

Linux内核定时器使用及说明

《Linux内核定时器使用及说明》文章详细介绍了Linux内核定时器的特性、核心数据结构、时间相关转换函数以及操作API,通过示例展示了如何编写和使用定时器,包括按键消抖的应用... 目录1.linux内核定时器特征2.Linux内核定时器核心数据结构3.Linux内核时间相关转换函数4.Linux内核定时

检查 Nginx 是否启动的几种方法

《检查Nginx是否启动的几种方法》本文主要介绍了检查Nginx是否启动的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1. 使用 systemctl 命令(推荐)2. 使用 service 命令3. 检查进程是否存在4

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝

MySQL字符串转数值的方法全解析

《MySQL字符串转数值的方法全解析》在MySQL开发中,字符串与数值的转换是高频操作,本文从隐式转换原理、显式转换方法、典型场景案例、风险防控四个维度系统梳理,助您精准掌握这一核心技能,需要的朋友可... 目录一、隐式转换:自动但需警惕的&ld编程quo;双刃剑”二、显式转换:三大核心方法详解三、典型场景

python中的flask_sqlalchemy的使用及示例详解

《python中的flask_sqlalchemy的使用及示例详解》文章主要介绍了在使用SQLAlchemy创建模型实例时,通过元类动态创建实例的方式,并说明了如何在实例化时执行__init__方法,... 目录@orm.reconstructorSQLAlchemy的回滚关联其他模型数据库基本操作将数据添

Spring配置扩展之JavaConfig的使用小结

《Spring配置扩展之JavaConfig的使用小结》JavaConfig是Spring框架中基于纯Java代码的配置方式,用于替代传统的XML配置,通过注解(如@Bean)定义Spring容器的组... 目录JavaConfig 的概念什么是JavaConfig?为什么使用 JavaConfig?Jav

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Java中ArrayList与顺序表示例详解

《Java中ArrayList与顺序表示例详解》顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构,:本文主要介绍Java中ArrayList与... 目录前言一、Java集合框架核心接口与分类ArrayList二、顺序表数据结构中的顺序表三、常用代码手动