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

这篇具有很好参考价值的文章主要介绍了JAVA的sort用法详解(二维数组排序,List<>排序,lambada表达式,自定义类型排序)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言:

一维数组降序:

方法1.Comparator接口:

代码实现:

方法2.Collections.reverseOrder():

代码实现: 

二维数组排序:

代码如下:

List<>排序:

代码如下:

自定义类型比较排序:

按照年龄逆序排序:

按照姓名升序排序:

lambada表达式简写:

一维数组逆序代码:

二维数组排序代码:

List<>排序代码:

自定义类型排序:

结语:


前言:

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

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

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

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

二维数组排序java,sort,java,sort,lambada表达式,二位数组排序,自定义类型,List排序

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

二维数组排序java,sort,java,sort,lambada表达式,二位数组排序,自定义类型,List排序

一维数组降序:

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

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

基本类型实现不了。

方法1.Comparator接口:

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

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

二维数组排序java,sort,java,sort,lambada表达式,二位数组排序,自定义类型,List排序

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

 二维数组排序java,sort,java,sort,lambada表达式,二位数组排序,自定义类型,List排序

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

二维数组排序java,sort,java,sort,lambada表达式,二位数组排序,自定义类型,List排序

代码实现:

import java.util.Arrays;
import java.util.Comparator;
class cmp implements Comparator<Integer>{
    @Override
    public 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] + " ");
        }
    }
}

效果如下:

二维数组排序java,sort,java,sort,lambada表达式,二位数组排序,自定义类型,List排序

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

方法2.Collections.reverseOrder():

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

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

二维数组排序java,sort,java,sort,lambada表达式,二位数组排序,自定义类型,List排序

代码实现: 

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这样的基本类型还是不行🈚。

二维数组排序java,sort,java,sort,lambada表达式,二位数组排序,自定义类型,List排序

二维数组排序:

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

代码如下:

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

import java.util.Arrays;
import java.util.Comparator;
class cmp implements Comparator<int[]> {
    @Override
    public 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();
        }
    }
}

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

二维数组排序java,sort,java,sort,lambada表达式,二位数组排序,自定义类型,List排序

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

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

List<>排序:

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

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

二维数组排序java,sort,java,sort,lambada表达式,二位数组排序,自定义类型,List排序

要想实现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>{
    @Override
    public 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 + " ");
        }
    }
}

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

二维数组排序java,sort,java,sort,lambada表达式,二位数组排序,自定义类型,List排序

自定义类型比较排序:

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

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

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

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

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

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

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

二维数组排序java,sort,java,sort,lambada表达式,二位数组排序,自定义类型,List排序

按照年龄逆序排序:

代码如下:

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;
    }
    @Override
    public 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方法。

二维数组排序java,sort,java,sort,lambada表达式,二位数组排序,自定义类型,List排序

升序就不用说了。

按照姓名升序排序:

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

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

结果如下:

二维数组排序java,sort,java,sort,lambada表达式,二位数组排序,自定义类型,List排序

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] + " ");
        }
    }
}

结果如下:

二维数组排序java,sort,java,sort,lambada表达式,二位数组排序,自定义类型,List排序

二维数组排序代码:

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();
        }

    }
}

效果如下:

二维数组排序java,sort,java,sort,lambada表达式,二位数组排序,自定义类型,List排序

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,java,sort,lambada表达式,二位数组排序,自定义类型,List排序

自定义类型排序:

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

二维数组排序java,sort,java,sort,lambada表达式,二位数组排序,自定义类型,List排序

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

结语:

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

二维数组排序java,sort,java,sort,lambada表达式,二位数组排序,自定义类型,List排序文章来源地址https://www.toymoban.com/news/detail-844857.html

到了这里,关于JAVA的sort用法详解(二维数组排序,List<>排序,lambada表达式,自定义类型排序)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Java对二维数组进行排序

    今天刷题时需要用到二维数组的排序,奈何一下想不起具体的写法了,那就浅浅复习总结一下吧,加深一下自己的印象。 主要可以分为三种写法: 1.运用Comparator的常规写法,例如:         上述代码提到的的o1和o2可以理解为二维数组中的任意两个一维子数组,其中o1[0]与

    2024年02月09日
    浏览(32)
  • 【C++入门】学习使用二维数组基本知识及用法详解

    🧛‍♂️iecne个人主页: : iecne的学习日志 💡每天 关注 iecne的作品,一起进步 💪一起学习,必看iecne 🐳希望大家多多支持🥰一起进步呀! 二维数组就是在一维数组上多加一个维度。 建议:以下三种定义方式,利用第二种更加直观,提高代码可读性 第二种就是在定义一

    2024年01月25日
    浏览(35)
  • 新手入门Java数组排序及二维数组(有练习)

    1.数组的定义方式都有哪几种 2.基本数据类型的数组中默认值分别是什么 byte[] short[] int[] long[] double[] float[] boolean[] char[] String[] 0 0 0 0 0.0 0.0f flase ‘u0000’ null 3.数组有哪些特征 数组一旦赋值,长度就固定下来了,不可再改变。数组的最大下标是数组的长度-1.数组下标从0开始

    2024年02月01日
    浏览(40)
  • Java基础:Collections.sort的两种用法详解

    Collections是⼀个⼯具类,sort是其中的静态⽅法,是⽤来对 List 类型进⾏排序的,它有两种参数形式:

    2024年02月10日
    浏览(32)
  • java的list数组按数组中对象的某个属性排序

    在 Java 中,可以使用 Collections.sort() 方法和 Comparator 接口来对 List 中的对象按照对象的某个属性进行排序。以下是一个示例代码: 假设有一个 Person 类,它包含一个 name 字符串属性和一个 age 整数属性,我们可以通过对 ListPerson 类型的列表进行排序,按照 Person 对象的 age 属性

    2024年02月04日
    浏览(36)
  • C# list的sort排序

    目录 前言: 值类型的排序: 方法一:直接调用sort函数 方法二:通过C# ling表达式与CompareTo接口配合使用 方法三:降序的实现 对于自定义类型的sort排序  方法一:通过实现IComparable接口重写CompareTo方法来排序 方法二:通过ling表达式实现          有时需要对List列表中内

    2024年02月15日
    浏览(23)
  • C#中sort排序相关用法介绍

     C#中,List.Sort() 不仅为我们提供了默认的排序方法,还为我们提供了4种自定义排序的方法,通过默认排序方法,我们无需重写任何Sort()方法的实现代码,就能对单参数类型的List数据进行单一规则的排序,如果通过对这些方法进行改进我们可以轻松做到对多参数、多规则的复

    2024年02月15日
    浏览(38)
  • 【Java基础教程】(八)面向对象篇 · 第二讲:Java 数组全面解析——动态与静态初始化、二维数组、方法参数传递、排序与转置、对象数组、操作API~

    掌握数组的动态及静态创建方式、使用及特征; 掌握引用类型数据的特征; 掌握数组的排序、转置操作; 数组可以将多个变量进行统一的命名,这样相同类型的元素就可以按照一定的顺序进行组合排列 。在 Java中,数组属于引用类型数据,所以在数组的操作过程中,也一定

    2024年02月13日
    浏览(29)
  • JDK8的lambda方式List多字段排序List.stream().sorted()

    JDK8的lambda方式List多字段排序List.stream().sorted() 多字段排序 拼音排序: 引入jar包: 自定义比较器: 结束。

    2024年02月10日
    浏览(29)
  • 27从零开始学Java之详解复杂的二维数组与多维数组

    作者 :孙玉昌,昵称【 一一哥 】,另外【 壹壹哥 】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 在前几篇文章中, 壹哥 给大家介绍了Java里的一维数组,涉及到了数组的创建初始化、数组遍历、拷贝、扩容、排序、查找等核心

    2024年02月02日
    浏览(29)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包