自然排序与比较器排序的使用

news2025/7/23 8:13:50

1、自然排序:java.lang.Comparable

Comparable 接口中只提供了一个方法: compareTo(Object obj) ,该方法的返回值是 int 。如果返回值为正数,则表示当前对象(调用该方法的对象)比 obj 对象“大”;反之“小”;如果为零的话,则表示两对象相等。

总结为一句话:实现Comparable,重写 compareTo方法

案列:以TreeMap为例,默认的升序,可以重写自然排序的方法改变原有排序

public static void testComparable(){
        TreeMap<Car,Object> tmp = new TreeMap<Car,Object>();
        tmp.put(new Car(4), "肆");
        tmp.put(new Car(1), "壹");
        tmp.put(new Car(5), "伍");
        tmp.put(new Car(3), "三");
        tmp.put(new Car(2), "贰");
        System.out.println(tmp);
        //结果://{Car [price=5.0]=伍, Car [price=4.0]=肆, Car [price=3.0]=三, Car [price=2.0]=贰, Car [price=1.0]=壹}
    }

//自定义TreeMap排序方法 自然排序

class Car implements Comparable<Car>{
    private double price;
 
    @Override
    public int compareTo(Car o) {
        // TODO Auto-generated method stub
        if(this.price>o.getPrice()){
            return -1;//大的往前排
        }else if(this.price<o.getPrice()){
            return 1;//小的往后排
        }else{
            return 0;
        }
    }
 
    @Override
    public String toString() {
        return "Car [price=" + price + "]";
    }

2、比较器排序:java.util.Comparator

总结为一句话:实现Comparator 接口,重写compare方法

public static void testComparator(){
        //HashMap<Integer,Object> hm = new HashMap<Integer,Object>();
        TreeMap<Integer,Object> tmp = new TreeMap<Integer,Object>(new MyComparatorBigtoSmall());
        tmp.put(4, "肆");
        tmp.put(1, "壹");
        tmp.put(5, "伍");
        tmp.put(3, "三");
        tmp.put(2, "贰");
        //System.out.println(tmp);//默认排序结果:{1=壹, 2=贰, 3=三, 4=肆, 5=伍}
        System.out.println(tmp);//修改为比较器排序(升序){5=伍, 4=肆, 3=三, 2=贰, 1=壹}
    }
 
//自定义TreeMap排序方法    比较器排序    
    class MyComparatorBigtoSmall implements Comparator<Integer>{
 
        @Override
        public int compare(Integer o1, Integer o2) {
            // TODO Auto-generated method stub
            return o2-o1;
        }
    }

自然排序的使用

第一步:使用空参构造创建一个TreeSet集合对象。

第二步:在自定义类中实现一个Comparable接口(注意,接口里要写泛型,而泛型的类型要与集合里的数据类型一致

第三步:重写里面的compareTo()抽象方法。抽象方法里要写排序规则,排序规则如下。

img

/*
 * TreeSet集合来存储Student类型
 * */
public class MyTreeSet2 {
    public static void main(String[] args) {
        TreeSet<Student> ts = new TreeSet<>();

        Student s1 = new Student("xuyimiao",28);
        Student s2 = new Student("chenxuyuan",27);
        Student s3 = new Student("xiaoyufeng",29);
        Student s4 = new Student("caofengze",28);
        Student s5 = new Student("caofengze",30);


        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);
        ts.add(s5);
        System.out.println(ts);
    }
}
public class Student implements  Comparable<Student>{
    private String name;
    private int age;
    public Student() {
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Student o) {
        //按照对象的年龄进行排序
        //主要判断条件
        int result = this.age - o.age;
        //次要判断条件
        result = result == 0 ? this.name.compareTo(o.getName()) : result;
        return result;
    }
}

比较器排序的使用

img

public class MyTreeSet4 {
    public static void main(String[] args) {
        TreeSet<Teacher> ts = new TreeSet<>(new Comparator<Teacher>() {
            @Override
            public int compare(Teacher o1, Teacher o2) {
                //o1表示现在要存入的那个元素
                //o2表示已经存入到集合中的元素
                //主要条件
                int result = o1.getAge() - o2.getAge();
                //次要条件
                result = result == 0 ? o1.getName().compareTo(o2.getName()) : result;
                return result;
            }
        });
        Teacher t1 = new Teacher("zhangsan",23);
        Teacher t2 = new Teacher("lisi",22);
        Teacher t3 = new Teacher("wangwu",24);
        Teacher t4 = new Teacher("zhaoliu",24);
        ts.add(t1);
        ts.add(t2);
        ts.add(t3);
        ts.add(t4);
        System.out.println(ts);
    }
}
public class Teacher {
    private String name;
    private int age;

    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

该使用哪一种方式?

img

如何理解?

//按长度进行排序
public class MyTreeSet5 {
    public static void main(String[] args) {
        TreeSet<String> ts = new TreeSet<>(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                //首先比较字符串长度是否相等,短的字符串放左边,长的字符串放右边
                int result = o1.length() - o2.length();
                //如果字符串长度相等,再来比里面的字母。ASCII码小的在左边,ASCII码大的在右边
                result = result == 0 ? o1.compareTo(o2) : result;
                return result;
            }
        });
        //Lambda表达式方法
        /*TreeSet<String> ts = new TreeSet<>((String o1, String o2) -> {
            int result = o1.length() - o2.length();
            result = result == 0 ? o1.compareTo(o2) : result;
            return result;
        });*/
        ts.add("c");
        ts.add("ab");
        ts.add("df");
        ts.add("qwer");

        System.out.println(ts);
    }
}

上面这串代码中,由于Java自带的String类中已经重写了Comparable接口,我们没法再修改。所以只能使用比较排序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/35547.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端实现克里金插值分析(二)

作者:yangjunlin 在上一篇文章中我们已经使用了像素法实现克里金插值的方式&#xff0c;但是问题也就随之抛了出来。1.第一点&#xff0c;在反距离权重插值的时候&#xff0c;因为处理的数据量大会直接导致主线程卡&#xff0c;导致用户体验不好&#xff0c;2.第二点&#xff0…

Apache开启SSL(https)访问网站配置

前言:问题稍微有点绕,整个配置过程,测试成功 服务器的80端口分配了Apache使用了(用phpstudy运行php网站),服务器上还有(IIS网站,站点使用81端口),需要用80转81(中转代理一下到IIS访问网站,iis无需重复配置ssl设置) 就实现了:一台服务器使用2种语言(php/asp.ne…

闭环控制(自动控制理论)

目录 闭环控制 开环控制和闭环控制优缺点 闭环控制 即有被控制量反馈的控制。从系统中信号流向看&#xff0c;系统的输出信号沿反馈通道又回到系统的输入端&#xff0c;构成闭合通道&#xff0c;故称作为闭环控制系统&#xff0c;又或者称为反馈控制系统 这种控制方式&#xf…

微服务环境搭建SpringCloud入门

目录 案例准备 技术选型 模块设计 微服务调用 创建父工程 创建基础模块 创建用户微服务 创建商品微服务 创建订单微服务 我们本次是使用的电商项目中的商品、订单、用户为案例进行讲解。 案例准备 技术选型 maven&#xff1a;3.5.4 数据库&#xff1a;MySQL 5.7 持…

【矩阵论】4. 矩阵运算——广义逆——广义逆的计算

4.3.2 AA^A 计算 a. 秩1公式 若A(aij)mn,r(A)1,则A1∑∣aij∣2AH1tr(AHA)AH\begin{matrix} 若A(a_{ij})_{m\times n},r(A)1,则A^\frac{1}{\sum \vert a_{ij}\vert^2}A^H\frac{1}{tr(A^HA)}A^H \end{matrix} 若A(aij​)mn​,r(A)1,则A∑∣aij​∣21​AHtr(AHA)1​AH​ AHAA^HAA…

Qt Quick 用cmake怎么玩子项目

以往在公司开发众多的项目中&#xff0c;都会出现要求本项目里部分功能模块代码需要具备保密性。如果需要对外输出demo工程&#xff0c;那么需要做到不会泄密。 举一下爪子&#xff0c;以前做雷达开发的时候&#xff0c;客户从公司那儿买了这些雷达模块&#xff0c;也会需要从…

信号量的使用

信号量 英文名字&#xff1a;semaphore 这里的进程信号量会为下列的信号量打基础 Ucos系统的信号量c线程的信号量java进程和线程的信号量 信号量作用 当多个进程/线程进行共享操作时&#xff0c;用于资源保护&#xff0c;以防止出现相互干扰的情况 信号量用于“资源的保护“ …

图论算法大合集【包括图的dfs和bfs遍历】【欧拉回路】【判断连通图】【Dijkstra算法】【floyd算法】【最小生成树prim算法】【拓扑排序】

图论算法大合集一. dfs和bfs 过程中要有visited数组标记已遍历过的节点6-1.1 邻接矩阵存储图的深度优先遍历6-1.2 邻接表存储图的广度优先遍历二、欧拉回路&#xff08;度为偶数&#xff0c;且为连通图&#xff09;6-1.3 哥尼斯堡的“七桥问题”三、判断连通图6-1.4 地下迷宫探…

进程调度的基本关系

文章目录1.什么是进程(process)2.进程的特性1.进程是非常重要的"软件资源"2.PCB(进程控制块)描述了哪些进程特征3.并行和并发4.进程的虚拟地址空间和进程间通信1.什么是进程(process) 简单来说就是:一个程序跑起来就是一个进程 一个应用没跑起来叫做程序,跑起来了就…

堆排序算法

一、大顶堆和小顶堆概念 堆排序是利用堆数据结构而设计的一种排序算法&#xff0c;堆排序是一种选择排序&#xff0c;其最坏&#xff0c;最好&#xff0c;平均时间复杂度均为O(nlogn)&#xff0c;同时也是不稳定排序。 堆是具有以下性质的完全二叉树&#xff1a;每个结点的值都…

Hive数据定义语言-DDL-建表高阶语法(内外部、分区、分桶、事务、视图、物化视图)

文章目录1. 内部表、外部表1.1 内部表1.2 外部表1.3 内、外部表差异1.4 Location关键字的作用2. 分区表-Partitioned Tables2.1 概念2.2 创建2.3 分区表数据加载2.3.1 静态分区2.3.2 动态分区2.4 注意事项3. 分桶表-Bucketed Tables3.1 概念3.2 规则3.3 语法3. 事务表-Transact…

编译openMVG出现的错误的解决

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> submodule(s) are missing, please update your repository 在使用CMake生成openMVG解决方案时&#xff0c;出现错误&#xff1a; CMake Error at CMakeL…

另眼看数据中台

目录 前言&#xff1a; 一、故事的开始 二、成也中台&#xff0c;败也中台 1、中台是什么 2、数据中台与企业数字化转型 3、中台的赋能 4、数据中台、业务中台、技术中台 5、中台不一定适合你 ​编辑​编辑小结&#xff1a; 三、 自检数据应用的成熟度 前言&#xff1…

Python学习基础笔记十二——文件

1、目的&#xff1a;是要将数据永久地保存下来&#xff0c;就需要将数据永久保存在硬盘中。 2、概念&#xff1a;文件就是操作系统提供给应用程序来操作硬盘虚拟接口&#xff0c;用户或应用程序通过操作文件&#xff0c;可以将自己的数据永久地保存下来。 3、步骤&#xff1b; …

MACU-Net-用于精细分辨率遥感图像语义分割网络

摘要&#xff1a; 在本文中我们结合了由不同层次的U-Net生成的多尺度特征&#xff0c;设计了一个多尺度跳跃连接和基于非对称卷积的网络--MACU-Net。 网络具有以下几个优点1&#xff09;多尺度跳跃连接将低层和高层特征图中包含的语义特征结合并重新进行排列2&#xff09;非对…

一文搞懂傅里叶级数与变换

描述 这篇文章的目标&#xff1a;以最简单易懂的方式&#xff0c;让大家学会傅里叶变换&#xff01; 为什么要写一篇关于傅里叶变换相关知识的文章呢。有两个原因&#xff1a; 一、这个知识很有趣&#xff0c;可以理解它是一件炫酷的事情。在工作中&#xff0c;一次分享会同事…

BufferPool缓存机制

BufferPool缓存机制 1、更新数据流程 流程图 sql更新数据刷到磁盘前会经过serve层 连接器-管理连接和权限校验优化器-语法词法分析优化器-执行计划生成索引选择执行器-连接bufferPool 1.1 流程步骤 从磁盘加载数据到buffer pool&#xff0c;会先去判断要更新的数据所在数据…

Hantek6022BE 虚拟示波器

​ 0. Hantek 厂家提供的介绍 安装方法按照说明来。 很多人都说原厂的软件不好用&#xff0c;于是折腾就开始了&#xff1a; 1. VIRTINS Multi-Instrument 这个别人已经写的很详细了 大概需要准备 Multi-Ins 这软件&#xff0c;目前找到 3.7 的合用 菜单里 添加设备到库&a…

HTML+CSS详细知识点复习(上)

文章目录一、初识HTML1、标签概述二、初识CSS1、CSS核心基础2、设置文本样式3、高级特性4、CSS的优先级三、CSS选择器1、关系选择器四、盒子模型1、边框属性2、边距属性3、背景属性4、盒子的宽与高5、CSS3新增盒子模型属性一、初识HTML HTML&#xff08;超文本标记语言&#x…

用Python采集世界杯球队热搜数据 并发送邮箱通知

前言 嗨嗨&#xff0c;最近世界杯的热度可是一直在增长啊 待会就是 卡塔尔和塞内加尔打了 怎么说 还是有点期待结果的 趁现在有点无聊 就想着用Python采集世界杯球队热搜数据 顺便 发送邮箱通知 话不多说&#xff0c;马上开始 知识点 动态数据抓包requests发送请求json数据…