java sort方法详解

2023-10-29

JAVA

ARRAYS.SORT 方法

    static void sort(ElementType[] a)
    默认为升序排序
    static void sort(ElementType[] a, int FromIndex, int ToIndex)
    在指定范围(FromIndex, ToIndex)内升序排序
    static void sort(T[] a, Comparator<? super T> c)
    根据指定的比较器指定的顺序,对指定的对象数组进行排序。

这里对指定顺序的sort详细记录。

底层原理:插入排序+二分查找

开始的默认0索引的数据是有序序列,然后遍历数组后面的每一个元素,将每一个元素插入到前面有序序列的指定地方。

comparator比较器

Comparator是一个接口,需要重写里面的compare函数。
这里可以使用匿名内部函数类

    这里以int a[]数组为例
    Arrays.sort(a, new Comparator<int[]>() {
        @Override
        public int compare(int[] o1, int[] o2) {
            return [返回值];
        }
    });
  1. 返回值为负数:将o1与o2前面的数进行比较
  2. 返回值为正数,将o1与o2后面的数进行比较
  3. 返回值为0,同正数。

return o1 - o2;
升序:

  1. o1 > o2时将o1与o2后面的数进行比较
  2. o1 < o2时将o1与o2前面的数进行比较
  3. o1 == o2时可插入

return o2 - o1:
降序:

  1. o1 > o2时将o1与o2前面的数进行比较
  2. o1 < o2时将o1与o2后面的数进行比较
  3. o1 == o2时可插入
注意上面的查找比较的原理是二分查找

另外还有更加简单的Lambda表达式写法

    sort(数组名, 排序规则)
    升序:
    sort(arr, (x, y) -> x - y);
    降序:
    sort(arr, (x, y) -> x - y);

sort可以对各种对象进行排序,比如下面的二维数组:
a = { {3, 3}, {2, 2}, {4, 4}, {5, 5}, {1, 1} };

    以第一个元素为关键字进行升序排序时:
    sort(a, (x, y) -> x[0] - y[0]);
    结果为 a = {{1,1}, {2,2}, {3,3}, {4,4}, {5,5}}
    以第一个元素为关键字进行降序排序时:
    sort(a, (x, y) -> y[0] - x[0]);
    结果为 a = {{5,5}, {4,4}, {3,3}, {2,2}, {1,1}}
    
    如果要以第二个元素为关键字进行排序是,将x[0]-y[0]变为x[1]-y[1]即可

除了多维数组也可以对类选择关键字进行排序:

先定义一个类:
class Point { //这里是否构造函数都可以
    private int val;
    public int getVal() {
        return this.val;
    }
    public void setVal(int val) {
        this.val = val;
    }
}
public class testSort {
    public static void main(String[] args) throws Exception {
        Point[] point = new Point[3];
        // 注意下面的初始化是必须的!!!
        for(int i = 0; i < point.length; i ++)
            point[i] = new Point();
        for(int i = 0; i < point.length; i ++) {
            point[i].setVal(i);
        }
        // 降序:
        Arrays.sort(point, (x, y) -> y.getVal()- x.getVal());
        for(int i = 0; i < point.length; i ++) {
            System.out.printf("point[%d] = %d\n", i, point[i].getVal());
        }
    }
}

结果:

point[0] = 2
point[1] = 1
point[2] = 0

测试代码:

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

class Point {
    private int val;

//    public void Point() {
//        this.val = 3;
//    }
    public int getVal() {
        return this.val;
    }
    public void setVal(int val) {
        this.val = val;
    }


}

public class testSort {

    public static void main(String[] args) throws Exception {
        int[][] a = new int[5][2];
        for(int i = 0; i < 5; i ++) {
            a[i][0] = i;
            a[i][1] = i;
        }
        Arrays.sort(a, (x, y) -> (x[0] - y[0]));
        System.out.println("-----------升序---------");
        for(int i = 0; i < 5; i ++) {
            System.out.printf("a[%d] = {%d %d}\n",i, a[i][0], a[i][1]);
        }
        System.out.println();

        Arrays.sort(a, (x, y) -> (y[0] - x[0]));
        System.out.println("-----------降序---------");
        for(int i = 0; i < 5; i ++) {
            System.out.printf("a[%d] = {%d %d}\n",i, a[i][0], a[i][1]);
        }
        System.out.println();
        // 匿名函数方法
//        Arrays.sort(a, new Comparator<int[]>() {
//            @Override
//            public int compare(int[] o1, int[] o2) {
//                return o1 - o2;
//            }
//        });
        System.out.println("-------对类排序-----");
        Point[] point = new Point[3];
        // 注意下面的初始化是必须的!!!
        for(int i = 0; i < point.length; i ++)
            point[i] = new Point();
        for(int i = 0; i < point.length; i ++) {
            point[i].setVal(i);
        }
        // 降序:
        Arrays.sort(point, (x, y) -> y.getVal()- x.getVal());
        for(int i = 0; i < point.length; i ++) {
            System.out.printf("point[%d] = %d\n", i, point[i].getVal());
        }

    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java sort方法详解 的相关文章

随机推荐

  • linux卸载openjdk并安装jdk

    1 java version 查看是否安装 2 查看有哪些java安装文件 3 开始卸载 卸载掉下面两个 java version查看找不到java版本 就说明卸载成功了 如果卸掉下面两个还能看到java版本的话 就可以把第一个和第二个一起
  • python中字符串大小写判断和转换函数(upper,lower,capitalize,istitle)

    S为一字符串 可以使用python的内建函数对S中的字母大小写做判断和改变 supper lower和capitalize是转换函数 可以把字符串中的字母做相应的处理 istitle isupper和islower是判断函数 它们对字符串做
  • opencv+mfc搭建框架

    环境 vs2012 opencv2 49 功能 加载图片 保存 二值化 放大 缩小 旋转 实现方法 用opencv来实现相应的图像处理功能 用mfc的对话框来搭建框架 难点 在Mfc框架下显示图片 解决办法 根据父窗口与子窗口的关系 将op
  • VuforiaAR扫描3d物体

    Unity版本为2020 3 20 Vuforia版本为9 6 3 有偿demo 链接 https pan baidu com s 1YlmKeMWvMFRYPhieP3OrqQ 3D物体数据扫描 安卓机扫描3D物体的Scanner工具包下
  • C#的线性规划代码

    using System using System Collections Generic using System Linq using System Text using System Threading Tasks namespace
  • C语言实现RAND函数的方法

    C语言使用rand 一个值就可以实现生成一个伪随机数供我们使用 那么rand函数是如何实现的呢 我们自己可不可以编辑出来 其实是可以的 rand作为伪随机数发生器产生的是一个伪随机数 一般的用途能够满足 要想实现这个函数 需要用一个公式 x
  • Springboot使用Thymeleaf模板引擎无法加载css样式等静态资源

    我的项目文件目录如下 在使用thymeleaf模板引擎时访问不到css样式文件如下 其原因是Thymeleaf模板引擎引用文件需要按照规定的写法 如下 需使用th href属性 路径需使用 文件路径 包裹 加上后就可以看见样式了
  • 报表的发布

    各种不同的报表工具 其发布方式是不一样的 现在说说一些报表工具的发布方式 笔者对报表了解不多 可能有些认识上的错误 望大家指明 DevExpress公司出品的报表工具 XtraReport 它的报表设计器就是集成在VS NET集成开发环境中
  • 简单了解JVM 组成以及各部分

    简单介绍JVM各组成部分 图1 JVM组成部分 JVM包含两个子系统和两个组件 两个子系统 类加载子系统 Class loader 和执行引擎 Execution engine 两个组件 运行时数据区 Runtime data area 本
  • leetcode 1233. 删除子文件夹

    1233 删除子文件夹 难度中等142 你是一位系统管理员 手里有一份文件夹列表 folder 你的任务是要删除该列表中的所有 子文件夹 并以 任意顺序 返回剩下的文件夹 如果文件夹 folder i 位于另一个文件夹 folder j 下
  • Java集合框架

    文章目录 一 简介 1 集合框架介绍 2 相关容器介绍 2 1 Set相关 2 2 List相关 2 3 Queue相关 2 4 Map相关 3 集合重点 二 ArrayList分析 1 ArrayList使用 2 ArrayList介绍
  • MMCV/MMDet/MMDet3D 的版本对应

    MMDetection3D version MMDetection version MMSegmentation version MMCV version master mmdet gt 2 24 0 lt 3 0 0 mmseg gt 0
  • [Pytorch系列-65]:生成对抗网络GAN - 图像生成开源项目pytorch-CycleGAN-and-pix2pix - 无监督图像生成CycleGan的基本原理

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 121962962 目录 第1章 什么是
  • 图片像素点统计

    最近这几天闲来无事 想起来18年12月末帮别人做了一个编程题 题目就是如何统计一张图片中的气泡数目 以及每个气泡的面积 上面这张图就是案例 里面白色的都是不规则形态的气泡 当拿到这个题目时看一眼就大致有些思路 因为怎么说也是学了数据结构的人
  • PHp 密码验证

    MD5加密 string md5 string str bool raw output false 参数 str 原始字符串 raw output 如果可选的 raw output 被设置为 TRUE 那么 MD5 报文摘要将以16字节长度
  • 纯前端实现地址分词,模糊匹配

    关于地址分词的一点思路 一些主要代码的简要说明 本人的思路是 解析的结果存储在一个类似树状的结构中 就和DOM节点类似 用parent字段指向父级 用children字段指向子级 准备工作 CityModel 类 先构建出一个 CityMo
  • QT程序发布方法

    方法一 首先打开想要发布的程序所在的项目 然后将右下角的Debug换成Release Debug版本的程序非常大 因为有很多调试的信息 接着 按Ctrl R运行一遍 确保自己的程序没有问题 然后到程序的输出文件夹中 一般在项目目录的上一层目
  • 二分法查找之应用

    待定 1 二分法查找的前提 有序 1 二分法查找元素 例题1 287 寻找重复数 给定一个包含 n 1 个整数的数组 nums 其数字都在 1 到 n 之间 包括 1 和 n 可知至少存在一个重复的整数 假设只有一个重复的整数 找出这个重复
  • python opencv去图片水印

    背景 最近有一个需要为图片去水印的需求 于是各种折腾开始 背景了解图片标准 图片使用RGB编码 RGB色彩模式是工业界的一种颜色标准 是通过对红 R 绿 G 蓝 B 三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色 RGB即是代
  • java sort方法详解

    JAVA ARRAYS SORT 方法 static void sort ElementType a 默认为升序排序 static void sort ElementType a int FromIndex int ToIndex 在指定范