比较器(算法中排序)

news/2024/9/29 4:41:24 标签: java, 算法, 开发语言

方式一:不常用

让实体类实现Comparable接口,泛型是需要比较的类型,同时重写compareTo方法

缺点:对代码有侵入性。

java">public class Student implements Comparable<Student> {
    private String name;
    private double score;
 
    // 构造函数和其他方法省略
 
    @Override
    public int compareTo(Student other) {
        return Double.compare(this.score, other.score); // 比较成绩
    }
}

重点:方式二:重写Comparator接口

 注意,这里compare方法,返回值是int,所以如果是比较非int类型的数据,记得先转换成int。

javascript">        String[] strings = {"123", "456"};
        Arrays.sort(strings,new Comparator<String>(){
            @Override
            public int compare(String o1, String o2) {
                return Integer.parseInt(o1)-Integer.parseInt(o2);
            }
        });

对于compare方法:详见下面的二分搜索源码 

pivot是当前需要被插入进去的数,a[mid]是原数组中的中间值,这个过程通过二分(数组是有序的)快速找到被插入进去的点,如果被插进去的值(新值)比中间值(旧值)小,则移动右指针(right = mid ,说明插入点在中间值的左边,因为mid = (left+right)/2 ),反之,在右边,移动左指针(left = mid+1)
当然,这里逻辑是基于比较器的,如果重写了,(默认升序,重写为降序),就完全相反了。

比如上面图:默认是o1 - o2 ,即新值如果小于旧值,移动右指针,插在左边。升序。
如果重写,即o2 - o1,即新值如果小于旧值,移动左指针,插在右边。降序。

if(c.compare(pivot,a[mid]) < 0) 其中 c是比较器,pivot是将要被插入的元素(新值),a[ mid ]是数组中,正在被二分查找比较的元素,我们重写比较器,其实也就是人为的改变走向,让本该去if分支的去了else,else的去到了if分支,进而改变左指针or 右指针的移动,进而改变了相对插入点的位置,左边or 右边,进而达到了升序or 降序。

默认升序!!! o1 - o2,如果需要改完降序,则反过来即可。

对于一个二维数组:其实就是很多个一维数组放一起

我们取每个二维数组的第一维(行),比较第一个元素,即10,2,1,6。

java"> int[][] points = {{10, 16}, {2, 8}, {1, 6}, {6, 12}};
        // 对二维数组按照每行数组的第一个元素进行排序
        Arrays.sort(points, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                // 按照从小到大排序
                return o1[0] - o2[0];
            }
        });

 如果说,第一个元素,相等,我们也可以比较第二个元素....

javascript"> Arrays.sort(points, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                // 按照从小到大排序
                if(o1[0]!=o2[0]) {
                    return o1[0] - o2[0];
                }else{
                    return o1[1] -o2[1];
                }
            }
        });


http://www.niftyadmin.cn/n/5682390.html

相关文章

【JAVA-数据结构】初识集合框架

时隔几个月&#xff0c;小主又回来了&#xff0c;近期我们来谈谈数据结构相关内容&#xff0c;这部分数据结构&#xff0c;我们将使用JAVA进行相关讲解&#xff0c;感兴趣的小伙伴持续关注&#xff0c;防止走丢。 1. 什么是集合框架 Java 集合框架 Java Collection Framework &…

在公司网络环境下,无法访问公共网络时,可在插件端配置网络代理后使用通义灵码

在公司网络环境下&#xff0c;无法访问公共网络时&#xff0c;可在插件端配置网络代理后使用通义灵码。 通义灵码插件下载&#xff1a;通义灵码_智能编码助手_AI编程-阿里云 配置网络代理 公司网络通常使用 HTTP 代理服务器在网络流量发送到目标位置之前进行拦截&#xff0c;以…

Qt C++设计模式->享元模式

享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;旨在通过共享相同对象来减少内存使用&#xff0c;尤其适合在大量重复对象的情况下。它通过将对象的可共享部分抽取出来&#xff0c;并在多个上下文中共享&#xff0c;从而避免对象的多次创建…

老古董Lisp实用主义入门教程(12):白日梦先生的白日梦

白日梦先生的白日梦 白日梦先生已经跟着大家一起学Lisp长达两个月零五天&#xff01; 001 粗鲁先生Lisp再出发002 懒惰先生的Lisp开发流程003 颠倒先生的数学表达式004 完美先生的完美Lisp005 好奇先生用Lisp来探索Lisp006 好奇先生在Lisp的花园里挖呀挖呀挖007 挑剔先生给出…

GUI-窗口,模态窗口,拖动窗口

private Rect dragWinPos new Rect(400, 400, 200, 150); private void OnGUI() { 一 窗口 第一个参数 id 是窗口的唯一ID 不要和别的窗口重复 第二个参数 委托参数 是用于 绘制窗口用的函数 传入即可 GUI.Window(1, new Rect(100, 100, 200, 150…

Qt 首次配置 Qt Creator 14.01 for Python

前言&#xff1a; 如何用QT实现Python的配置的交互界面。本文从0开始&#xff0c;进行实践的介绍。 在上一节里面&#xff0c;我们做了社区版本的配置&#xff1a; https://blog.csdn.net/yellow_hill/article/details/142597007?spm1001.2014.3001.5501 这一节&#xff0…

教师工作量数字化管理平台

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

生成模型小结

突然发现之前整理的makedown有必要放在博客里面,这样不同的设备之间可以直接观看达到复习的效果. GAN G和D不断的博弈提高自己。GAN的优点是保真度比较高&#xff0c;缺点是多样性比较低。 (auto-encoder)AE&#xff0c;DAE、VAE、VQVAE 输入x&#xff0c;经过编码器生成&…