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

这篇具有很好参考价值的文章主要介绍了Java 中数组的排序(基本类型,对象类型)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言: 本文主要针对的是 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 函数

同基本类型降序排序部分大同小异,在此不作叙述文章来源地址https://www.toymoban.com/news/detail-468244.html

到了这里,关于Java 中数组的排序(基本类型,对象类型)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 春眠不觉晓,Java数据类型知多少?基础牢不牢看完本文就有数了

    文编|JavaBuild 哈喽,大家好呀!我是JavaBuild,以后可以喊我鸟哥!俺滴座右铭是不在沉默中爆发,就在沉默中灭亡,一起加油学习,珍惜现在来之不易的学习时光吧,等工作之后,你就会发现,想学习真的需要挤时间,厚积薄发啦! 我们知道Java是面向对象的静态型编程语言,

    2024年02月02日
    浏览(31)
  • Java——一维数组和二维数组(主要详讲一维数组)

    目录 一维数组 创建,初始化,赋值 注意 一些数组的便捷使用方法 使用 .length得到数组长度 Arrays相关的使用 二维数组 文章某些地方会出现java与c语言的比较 文章内容参考韩顺平老师的课堂笔记 可以先创建再初始化,也可以创建的时候直接初始化。但是,如果选择先创建再

    2024年02月01日
    浏览(36)
  • Vue根据对象中的某个属性来排序对象数组【入门】

    要对对象数组按照其中某个属性进行排序,我们可以使用 JavaScript 的 sort() 方法,并传入一个自定义的比较函数。在这个比较函数中,我们可以指定按照哪个属性进行排序。 假设有一个对象数组 items,其中每个对象都包含一个 name 属性和一个 age 属性,我们可以使用以下代码

    2024年02月09日
    浏览(31)
  • vue数组对象中按某一字段排序

    给下列数组字段中的month排序 第一步:methods中写一个方法如下: 第二步:将需要的数组调用此方法 最后就成了如下图: 参考文章:https://www.jianshu.com/p/846b215a62de

    2024年02月11日
    浏览(31)
  • JS数组对象——中文按照首字母排序(分组)sort()、localeCompare()

    文章内容 文章链接 JS数组对象—— 根据日期进行排序 , 按照时间进行升序或降序排序 https://blog.csdn.net/XSL_HR/article/details/128579840?spm=1001.2014.3001.5501 JS数组对象—— 英文按照首字母进行排序 https://blog.csdn.net/XSL_HR/article/details/128579936?spm=1001.2014.3001.5501 排序在项目中非常实用,

    2024年02月03日
    浏览(29)
  • JS基本原理:对象类型赋值和原生类型赋值

    在本文中,我试图以最简洁的方式来阐明JavaScript编程原理中对象类型赋值和原生类型赋值之间的区别,以及它们各自是如何工作的。这也是我希望在我的JavaScript编程生涯早期就已经理解的东西。 首先,让我们回顾一下JavaScript中不同的原生类型和对象类型。 原生类型 :Boo

    2024年02月08日
    浏览(30)
  • JavaScript引用数据类型(对象类型)和原始(基本)数据类型特点比较

    为讲解JavaScript引用数据类型(对象类型)和原始(基本)数据类型特点比较,需要先回顾JavaScript数据类型有哪些? 一)原始(primitive:原始、基本)数据类型,也称为原始值(primitive value),包括: 1.布尔值(Boolean),其字面值只有两个,分别是true和false。 2.null,Null类型

    2024年02月05日
    浏览(39)
  • Net 高级调试之六:对象检查之值类型、引用类型、数组和异常的转储

    一、简介 今天是《Net 高级调试》的第六篇文章。记得我刚接触 Net 框架的时候,还是挺有信心的,对所谓的值类型和引用类型也能说出自己的见解,毕竟,自己一直在努力。当然这些见解都是书本上的,并没有做到眼见为实,所以总是有些东西说不清楚。今天,我们就好好的

    2024年02月05日
    浏览(40)
  • 【JAVA】数据类型与变量(主要学习与c语言不同之处)

    ✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:橘橙黄又青-CSDN博客 目标: 1. 字面常量 2. 数据类型 3. 变量 在上节课 HelloWorld 程序中, System.Out.println(\\\"Hello World\\\") ; 语句,不论程序何时运行,输出的都是 Hello World,其实 \\\"Hello Wo

    2024年03月28日
    浏览(36)
  • JS数组对象——根据日期进行排序Date.parse(),按照时间进行升序或降序排序localeCompare()

    排序在项目中非常实用,出现频率极高,尤其是 后台管理系统 ,需要我们对大量的数据进行 展示、处理、操作 。一般都是 从后台获取到数组对象 ,然后 根据其中的一个属性对数据进行升序或者降序 的处理。从本期文章开始,将分别介绍常用的三种排序—— 根据日期排序

    2024年02月01日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包