Java 中数组的排序(基本类型,对象类型)

java排序算法(6大类)-你都会了吗? 下面展示一些内联代码片。// 递归对左半部分和右半部分进行归并排序// 合并两个有序的子数组// 创建临时数组存储左半部分和右半部分的元素// 将元素复制到临时数组中i < n1;j++) {// 合并临时数组中的元素i++;k++;// 将剩余的元素复制到数组中i++;k++;j++;k++;System.out.println("排序前的数组:"); 阅读详情

前言: 本文主要针对的是 Java 自带的排序函数/接口

1. Java 中数组的自定义排序方法

实现 Comparable 接口中的 compareTo 函数或实现 Comparator 接口中的 compare 函数

两者存在使用上的区别,大体而言,Comparable 接口是为类服务,Comparator 接口是为 sort (Arrays.sort / Collections.sort)方法服务

1.1 基本类型

基本类型存在很多种,这里举例 int 型数组

1.1.1 升序排列

例如想要升序排序 int 型数组 nums,可以通过调用 Arrays.sort(nums) 方法进行升序排列

int[] nums = new int[]{4, 1, 6, 3};

// 升序
Arrays.sort(nums);

具体来讲,Arrays 类中的 sort 方法这样写道

Sorts the specified array of objects into ascending order, according to the natural ordering of its elements.
解释: 根据指定数组元素的自然顺序将指定数组的对象(数组中的元素)递增排序

那么对于整数而言,就是按照升序排列

1.1.2 降序排列

那么如果我想降序排列呢?那么这种额外的“需求”就需要自定义一个比较器(Comparator),在定义完比较器后,可以由 Arrays.sort 重载函数实现这种额外的“需求”,下面是 Arrays.sort 重载函数

public static <T> void sort(T[] a, Comparator<? super T> c) {
	// ....
}

下面这段话是关于这个函数的解释

Sorts the specified array of objects according to the order induced by the specified comparator
解释: 排序的顺序是通过指定的比较器(comparator)来推断出来的,以此将数组的对象(数组中的元素)进行排序

也就是说,这个函数要求我们自定义一个比较器(Comparator),通过引入 Comparator 接口,实现这个接口中的 compare 方法来告诉 Arrays.sort 函数如何排序

除此之外,我还应注意到,这个函数使用了泛型 T,因为泛型要求包容的必须是对象类型,而 int 是基本类型,所以第一个参数 T[] a 中的 a 不能是基本类型 int[]

好在 Java 中存在基本类型的包装类,例如: int 基本类型对应着 Integer 包装类,那么我们就通过如下方式,实现 int 型数组的降序排列

int[] nums = new int[]{4, 1, 6, 3};

// 降序
Integer[] newNums = new Integer[nums.length];
for (int i = 0; i < nums.length; i++) newNums[i] = nums[i];

Arrays.sort(newNums, new Comparator<>(){
    @Override
    public int compare(Integer o1, Integer o2) {
        if (o1 > o2) return -1;// 若此处指定为1, 则为升序
        else if (o1 < o2) return 1;// 若此处指定为-1, 则为升序
        else return 0;
    }
});

关于为什么 compare 中 o1 > o2 时要返回 -1 是降序,我查询了诸多资料都得不到一个确切的解释。但是可以明确的是: 排序的顺序是基于返回值的

在升序情况下,对于 compare(Integer o1, Integer o2) 函数

if (o1 > o2) return 1;	// 或其他正整数
else if (o1 < o2) return -1;	// 或其他负整数
else return 0;	// 两者相等时

在降序情况下,对于 compare(Integer o1, Integer o2) 函数

if (o1 > o2) return -1;	// 或其他负整数
else if (o1 < o2) return 1;	// 或其他负整数
else return 0;	// 两者相等时

对于 compareTo(Integer o2) 函数也有

o1.compareTo(o2);	// 升序
-o1.compareTo(o2);	// 降序

由于 Java 8 引入的 Lambda 表达式,Arrays.sort 可以简化为

Arrays.sort(newNums, (Integer o1, Integer o2) -> {
        if (o1 > o2) return -1;
        else if (o1 < o2) return 1;
        else return 0;
});

// 我们还可以省略掉参数的类型
Arrays.sort(newNums, (o1, o2) -> {
        if (o1 > o2) return -1;
        else if (o1 < o2) return 1;
        else return 0;
});

// 当然,我们还可以直接调用 Integer 包装类中实现的 compareTo 方法(默认是升序)
// 所需要在 o1.compareTo(o2) 前加负号
Arrays.sort(newNums, (o1, o2) -> -o1.compareTo(o2));

// 此外,我们还可以调用 Collections 类中的 reverseOrder 方法来实现逆序
Arrays.sort(newNums, Collections.reverseOrder());

至此,我们可以完成基本类型的降序排序

1.2 对象(自定义)类型

对象类型存在很多种,这里举例 String 型数组

1.2.1 实现 Comparable 接口中的 compareTo 函数

// Comparable 接口一般由自定类所实现,例如有 Person 类,想以 age 升序排序 Person 对象
Class Person implements Comparable{
	int age;
	
	// ... 省略中间细节
	
	// 实现了 Comparable 接口中的 compareTo 方法
	@Override
    public int compareTo(Object o) {
        Person person = (Person)o;
        if (this.age > person.age) return 1;
        else if (this.age < person.age) return -1;
        else return 0;
    }
}

之后,便可以通过 Arrays.sort 以 age 升序排序 Person 对象

// 创建 Person 数组
Person[] persons = new Person[]{new Person(18), new Person(20)};
// 按照 age 升序排序 Person 对象
Arrays.sort(persons);

1.2.2 实现 Comparator 接口中的 compare 函数

同基本类型降序排序部分大同小异,在此不作叙述

Python 逆向解析知乎盐选反爬字体,实现内容精准还原 本文详细解析了知乎盐选内容的反爬字体机制,并提供了使用Python逆向解析WOFF字体文件的完整方案。通过fontTools库构建解码字典,实现乱码文本的精准还原,帮助开发者应对动态字体策略,同时强调法律与道德风险。 阅读详情

相关推荐

Unity VR 零基础开发之 Pico4 MR

2、弹出弹窗后,点击Android选项,然后再点击Switch Platform按钮切换成安卓平台。3、切换完成后Android选项后面会显示unity图标。

十画的博客 5104

Java—常见数组排序方法

文章目录一、数组排序1. 冒泡排序2. 选择排序3. 二分查找4. 快速排序5. 插入排序6. 归并排序 一、数组排序 1. 冒泡排序 原理 从第一个元素开始,两两进行比较,将较大的数往后移,这样就将最大的数放在了最后。第二轮将第二大的数放在倒数第二个,以次类推,将元素按大小顺序排序 图示 代码实现 /** * 利用冒泡排序法对数组进行排序 */ pub...

qq_44495081的博客 1万+

自动驾驶仿真(二)—— 基于PreScan与Simulink的联合仿真

自动驾驶仿真软件介绍二—— PreScan与Simulink联合仿真1. Prescan仿真软件2. Prescan与Simulink联合仿真2. 1 Prescan和matlab软件安装2. 2 联合仿真配置3. 联合仿真实例3.1 一辆不按法规行驶的小车3.2 另一辆的正常行驶的小车3.3 视觉辅助摄像机3.4 传感器检测4. 系列学习视频教程5. 参考学习的书目教材 上一篇博文简单介绍了Carsim与Simulink联合仿真,接着这篇就再继续简单介绍另一款自动驾驶仿真软件Prescan,并且简单做个P

zhudj08的博客 1万+

Java数组排序的五种方法

Java数组排序的五种方法

weixin_43136144的博客 7404

避坑指南:英飞凌TC3XX的MCMCAN初始化常见错误及解决方法

本文针对英飞凌TC3XX系列MCU的MCMCAN模块初始化难题,深入剖析了寄存器配置时序、总线监控模式误用、中断映射错误及Message RAM地址冲突四大常见陷阱。通过实战代码示例和诊断流程,提供了清晰的避坑指南和解决方案,帮助嵌入式开发者高效解决CAN FD通信故障,确保汽车电子与工业控制项目的稳定运行。

weixin_29193259的博客 246

交换芯片数据通路四大核心微架构深度解析

数据通路是交换芯片性能的物理根基,决定着低延迟、高吞吐与突发承载能力。其本质是在硅片约束下对带宽、时序、功耗与统计复用的系统性权衡。Crossbar提供确定性低延迟但受RC延迟与功耗制约;VOQ通过虚拟队列隔离输出争抢,却引入仲裁复杂度与内存开销;Shared Buffer依托统计复用提升缓存利用率,但面临碎片化与管理策略挑战;Cell Fabric以固定长度cell重构交换粒度,在AI与金融等小包敏感场景实现尾延迟稳定。这些架构并非替代关系,而是面向不同网络不确定性(如流量不对称性、突发强度、包长分布)的

weixin_32667955的博客 189

JAVA数组中五种常见排序方法

1、以下在main()方法中调用,然后打印出相关的数据 public class ArrTest { public static void main(String args[]) { int[] arr = {23, 12, 48, 56, 45}; //方法一:Arrays.sort() //ArrSort(arr); //...

知行合一 3631

代码审计工具学习之Seay(安装以及初步认识)

目录 1.1名词解释 1.2代码审计的重要性 1.3代码审计的步骤 1.4代码审计的内容 1.5常见的代码审计工具 2 Seay 2.1什么是Seay 2.2Seay的安装过程 3典型漏洞分析 3.1什么是命令注入漏洞 3.2 如何理解命令注入漏洞 3.3 如何防御命令注入漏洞 4 利用工具对命令注入漏洞进行分析 4.1DVWA靶场命令注入漏洞分析 4.2 Pikachu靶场命令注入漏洞分析 1.1名词解释 软件代码审计是对编程项目中源代码的全面...

weixin_52515588的博客 2万+

java中数组的四种排序

数组和冒泡 排序

weixin_51253044的博客 3177

【电脑技巧】CPU正常运行时间过长,怎么解决?

目录 问题描述 解决方案 1、问题描述 不少同志都遇到过这样的问题:按【Ctrl + alt + delete】打开任务管理器,切到“性能”选项卡下,发现自己电脑的CPU正常运行时间竟然为好几十天!很多人担心这会不会影响电脑的寿命?于是很想知道这是怎么回事,以及如何解决这个问题。 我在此解答一下,这是由于你的电脑开启了“快速启动”这一选项的缘故,只要把这一选项关闭,问题就解决了。 2、解决方案 怎样关闭“快速启动”呢?按照如下的步骤来即可。 顺便声明一下,笔者的电脑配置: 使用电脑:联想Yoga 14

橄榄树下的孩子 3万+

DeerFlow 系列教程 第十四篇 | IM 渠道集成——让 DeerFlow 接入飞书、企微、Slack、Telegram

DeerFlow 系列教程 第十四篇本篇教程继续,全面剖析 DeerFlow 的 IM 渠道集成方案。我们将深入理解 Channel 抽象层设计、MessageBus 消息总线机制、ChannelManager 调度循环、四大 IM 平台(飞书、企业微信、Slack、Telegram)的适配实现,以及从 IM 消息到 Agent 响应再到 IM 回复的完整消息流转过程。

weixin_43674738的博客 416

用Arrays.sort()对数字排序

有的时候需要对数组里的element进行排序。当然可以自己编写合适的排序方法,但既然java包里有自带的Arrays.sort排序方法,在 数组元素比较少的时候可以使用。   Sorting an Array        1. 数字排序  int[] intArray = new int[] { 4, 1, 3, -23 };   Arrays.sort(intArray)

右上角同学的专栏 3522

全球气候模式降尺度方法总结及其代码实现

简介总结各类型气候模式降尺度方法

WW、forever的博客 1万+

五、C++处理Java的数组

数组的处理分为一下两种方式 1、基本类型 2、指向Java类型的引用 对象类型(Object[] ) 的数组 通用于两种类型的数组的函数 GetArrayLength(jarray array) 获取数组的长度 一、处理基本类型数组 1、 GetArrayElements(Array array,jboolean* isCopy) 此函数可以把Java基本类型数组转换到C/C++中的数

Future Of Magic 920

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Java 数组

Java中的数组是一种非常常见的数据结构,它可以存储一组相同类型的数据。Java数组是一个对象,它可以包含多个元素,并且每个元素都可以通过索引进行访问。在Java中,数组是静态分配的,这意味着在创建数组时,必须指定数组的大小,而且在数组的生命周期中,数组的大小不能更改。Java中的数组可以是基本类型数组或对象类型数组。基本类型数组可以存储整数、浮点数、布尔值等基本数据类型,而对象类型数组可以存储任意Java对象,例如字符串、自定义类等。

笔记 439

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

[Java基础]自定义排序

[Java基础]自定义排序

foggycity的博客 445

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java中JNI的使用详解第五篇:C/C++中操作Java中的数组

在Java中数组分为两种: 1.基本类型数组 2.对象类型(Object[])的数组(数组中存放的是指向Java对象中的引用) 一个能通用于两种不同类型数组的函数: GetArrayLength(jarray array); 首先来看一下怎么处理基本类型的数组: ...

chupu2979的博客 97

java.util.Arrays类详解(源码总结)

概述Arrays类位于java.util包下,是一个对数组操作的工具类。今天详细的看了看Arrays类的4千多行源码,现将Arrays类中的方法做一个总结(JDK版本:1.6.0_34)。Arrays类中的方法可以分为八类: sort(对数组排序) binarySearch(二分法查找数组中的元素) equals(比较两个数组是否相等) fill(对数组中的指定位置填充相同的内容) copyOf(数

Rainnnbow 3648

java中数组的比较与排序

在java中,碰到数组的排序,与比较的时候,一般想到的就是,Arrays这个类了,对于基本数据类型比较大致如下,如下列子:     int[] args1 ={1,3,2,9,5,4,7,10,8,6};       int[] args2 = {10,5,1,9,8,7,6,3,2,4};       Arrays.sort(args1);       Arrays.sor

yuanxiao27的专栏 607

Arrays.sort() 自定义排序规则

Arrays.sort() 自定义排序规则

ASDF的博客 1263

Java中JNI的使用详解第五篇 C/C++中操作Java中的数组

Java中JNI的使用详解第五篇 C/C++中操作Java中的数组

hgfujffg的博客 234

java 内置排序_JAVA内置排序Arrays.sort实现简述

前言在JAVA开发中,我们经常需要操作数组和集合,其中数组和链表的排序是重中之重。Arrays.sort方法用来对数组排序。Collections.sort()方法用来对链表排序,而Collections.sort()的底层,其实使用的也是Arrays.sort方法。所以JAVA内置排序的核心类,都在于Arrays工具类,接下来我们也重点剖析该类。1. Arrays工具类我们先来看下Arrays工...

weixin_39638305的博客 519

java容器--java.util.Arrays与java.util.Collections类中sort()的用法(转)

http://hi.baidu.com/zhangfengling521/blog/item/acfb3f058cde626503088105.html Java中有一个Arrays工具类,其中的static方法专门用来操作数组的,其中有一个sort(Object obj)排序方法 其中Collections工具类的static方法专门用来操作集合的,其中有一个sort(List...

web开发 187

关于Java中的排序

1. 对基本类型数组排序 默认顺序为从小到大,如何要自定义数组的排序顺序,只能将其自动装箱后自定义排序规则 package sort; import java.util.Arrays; import java.util.Comparator; public class IntSort { public static void main(String[] args) { int[] arr = new int[]{1, 2, 3, 6, -1, 3, 0, 9};

Young_Naive的博客 184

Java【第五篇】基本语法之--数组

数组概述 数组是多个相同类型数据的组合,实现对这些数据的统一管理数组属引用类型,数组型数据是对象(Object),数组中的每个元素相当于该对象的成员变量数组中的元素可以是任何数据类型,包括基本类型和引用类型 一维数组 一维数组的声明方式 type var[] 或 type[] var; 例如:   int a[];   int[] a1;   double b[];  ...

akb7208的博客 171
上一篇: Java Map中Value值的排序(利用Map统计次数)
下一篇: 每日一记 - 3.6
L!sa3
博客等级 码龄8年 2粉丝 13原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值