首页 > 编程语言 >java基础 Arrays.sort()用法

java基础 Arrays.sort()用法

时间:2022-10-03 23:12:43浏览次数:83  
标签:sort java name Arrays age int User public

1. 作用

对数组按照一定顺序排列,默认为升序。
排列过程中为快排,不需要额外的空间,也不需要重新定义一个数组来接收它。
示例:

public class Test {
    public static void main(String[] args) {
        int[] nums={1,2,43,5,1,2,6,3,8};
        Arrays.sort(nums);
        System.out.println(Arrays.toString(nums));
    }
}

输出:

[1, 1, 2, 2, 3, 5, 6, 8, 43]

2.介绍

2.1 重载方法

  1. sort(T[] a):对指定T型数组按数字升序排序。
  2. sort(T[] a,int formIndex, int toIndex):对指定T型数组中[formIndex,toIndex)数据按数字升序排序。
  3. sort(T[] a, Comparator<? supre T> c): 依据比较器对T型数组进行排序。
  4. sort(T[] a, int formIndex, int toIndex, Comparator<? supre T> c): 依据比较器产生的顺序对T型数组中的[formIndex,toIndex)进行排序。

2.2 使用方法

2.2.1 基础使用方法

package test;

import java.util.Arrays;
import java.util.Comparator;

public class Test<main> {
    public static void main(String[] args) {

        //1.sort(T[] a)
        int[] nums1={1,4,2,4,5,1};
        Arrays.sort(nums1);
        System.out.println(Arrays.toString(nums1));
        //output:[1, 1, 2, 4, 4, 5]

        //2. sort(T[] a,int start,int end)
        int[] nums2={1,4,2,4,5,1};
        Arrays.sort(nums2,2,5);
        System.out.println(Arrays.toString(nums2));
        //output:[1, 4, 2, 4, 5, 1]

        //3. sort(T[] a,Comparator<? super T> c)
        Integer[] nums3={1,4,2,4,5,1};
        Arrays.sort(nums3,new Comparator<Integer>(){

            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
        System.out.println(Arrays.toString(nums3));
        //output:[5, 4, 4, 2, 1, 1]


        //4. sort(T[] a,Comparator<? super T> c,int  start,int end)
        Integer[] nums4={1,4,2,4,5,1};
        Arrays.sort(nums4,2,5,new Comparator<Integer>(){

            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
        System.out.println(Arrays.toString(nums4));
        //output:[1, 4, 5, 4, 2, 1]
    }
}

2.2.2 进阶用法

对于sort()函数,个人觉得比较难的点是比较器的构建,下面将介绍sort()中比较器的不同用方法

1.比较器的构建

首先思考一个问题,为什么对于基本数据类型(boolean除外),为什么可以直接使用sort(T[] a),而不需要构建比较器?
原因:对于基本数据类型和其包装类来说,内部已经实现了Comparable接口,实现了方法compare(),因此可以直接使用sort(T[] a)。比如在Integer中,存在如下方法:

public static int compare(int x, int y) {
        return (x < y) ? -1 : ((x == y) ? 0 : 1);
    }

那就又引申出来另外一个问题,实现Comparable和实现Comparator有什么联系和区别呢?
具体的可以参考这一篇 Comparator和Comparable的区别

2.多维数据排序

在以前ACM训练中,经常遇到进行多维数据比较并排序,下面对介绍多维比较器的构建。
案例:对于用户存在三维数据:年龄,名字,身份ID。
建立比较器:首先按照年龄大小逆向排序,若相等,则按照id正向排序
User.java:

package test;

public class User {
    int age;
    String name;
    int id;

    public User(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public User(int age, String name, int id) {
        this.age = age;
        this.name = name;
        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;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
	@Override
    public String toString() {
        return "User{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", id=" + id +
                '}';
    }
}

Test.java:

package test;

import java.util.Arrays;
import java.util.Comparator;

public class Test<main> {
    public static void main(String[] args) {

        User[] users=new User[5];
        users[0]=new User(1,"alice",1);
        users[1]=new User(1,"alice",2);
        users[2]=new User(2,"alice",3);
        users[3]=new User(2,"Bob",4);
        users[4]=new User(3,"Bob",5);
        Arrays.sort(users, new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {

                if(o2.age!=o1.age){
                    return o2.age-o1.age;
                }else{
                    return o1.id-o2.id;
                }
            }
        });
        System.out.println(Arrays.toString(users));
    }
}

输出:

[User{age=3, name='Bob', id=5}
, User{age=2, name='alice', id=3}
, User{age=2, name='Bob', id=4}
, User{age=1, name='alice', id=1}
, User{age=1, name='alice', id=2}
]

Ref:

  1. https://blog.csdn.net/m0_47384542/article/details/124093498
  2. https://blog.csdn.net/weixin_39674445/article/details/111885150
  3. https://blog.csdn.net/m0_71087031/article/details/124850080

标签:sort,java,name,Arrays,age,int,User,public
From: https://www.cnblogs.com/weliars/p/16741247.html

相关文章

  • 每天一个小java练习(牢子好可爱啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊)2022.10.1
    练习题:接收用户输入的3个整数,并将它们的最大值作为结果输出:下面是我的代码以及运行截图啦啦啦啦:  这个本身很基础,,但是涉及到了?:的用法,就记录一下......
  • 力扣205(java)-同构字符串(简单)
    题目:给定两个字符串 s 和 t ,判断它们是否是同构的。如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。每个出现的字符都应当映射到另一......
  • 程序、进程和线程 Java多线程的状态【杭州多测师】【杭州多测师_王sir】
    CPU是以时间片的方式为进程分配CUP处理时间的,如果当一个进程同时要完成几件事的时候,如当从网上下载文件的时候,需要一边下载一边显示进度而且还要一边保存,如果按照单线程的......
  • java网络编程--4 UDP
    java网络编程--4UDP1.7、UDP发短信:不用连接,但是需要知道对方的地址主要包含两个类:DatagramPacket和DatagramSocket发送消息发送端:packagecom.ssl.lesson03;im......
  • Java学习之:静态初始化块、包、参数传递机制
    关键字static和静态初始化块static普通变量和方法从属于对象,而static修饰的成员变量和方法从属于类。静态方法:被static修饰的方法叫做静态方法,又被称为类方法。非static的方......
  • Java对象序列化和反序列化
    Java类的序列化和反序列化序列化:指将对象转换为字节序列的过程,也就是将对象的信息转换成文件保存。反序列化:将字节序列转换成目标对象的过程,也就是读取文件,并转换为对象。几......
  • Java项目打成镜像
    前言官方只有java8的docker镜像,如果我们的项目使用java11开发的,那么用java8的镜像打包运行会报错那么我们部署java项目有两种方式如:1.将项目打成war包部署到tomcat容器,2.自......
  • Java中Map.Entry
    Map<String,String>map=newHashMap<String,String>();map.put("1","value1");map.put("2","value2");map.put("3","value3");遍历map方式1:Ma......
  • java BIO
    packageIO;//文件、数组、管道、基本数据类型、缓冲、打印、对象序列化/反序列化,以及转换等​importjava.io.*;​/***操作文件{*  1.文件字节流:FileInpu......
  • JAVA学习前准备
    电脑常用快捷键Ctrl+C:复制Ctrl+V:粘贴Ctrl+A:全选Ctrl+X:剪切Ctrl+Z:撤销Ctrl+S:保存Alt+F4:关闭窗口Shift+delete:永久性删除文件win键+R:打开运行win键+E:打......