比较器(算法中排序)

devtools/2024/9/25 11:38:05/

方式一:不常用

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

缺点:对代码有侵入性。

java">public class Student implements Comparable<Student> {private String name;private double score;// 构造函数和其他方法省略@Overridepublic 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>(){@Overridepublic 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[]>() {@Overridepublic int compare(int[] o1, int[] o2) {// 按照从小到大排序return o1[0] - o2[0];}});

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

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


http://www.ppmy.cn/devtools/116945.html

相关文章

Redis解说

Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的高性能键值存储数据库&#xff0c;它通常被用作数据库、缓存和消息代理。 由于其内存中的数据结构存储、持久化选项以及丰富的数据类型支持&#xff0c;Redis 在处理大量数据和高并发请求时表现出色。 Redi…

MVC、MVP和MVVM三种设计模式之间的区别是什么

区别&#xff1a; mvc表示“模型-视图-控制器”&#xff0c;mvp表示“模型-视图-演示者”&#xff0c;mvvm表示“模型-视图-视图模型”&#xff1b; mvp、mvvm都是由mvc衍生出的。mvc中&#xff0c;view会直接从model中读取数据&#xff1b;mvp中&#xff0c;view并不直接使用m…

AWS开启MFA,提高安全性

引言 多因素认证&#xff08;Multi-Factor Authentication, MFA&#xff09;是一种重要的安全措施&#xff0c;可以显著提高您的AWS账号的安全性。通过启用MFA&#xff0c;即使密码被盗&#xff0c;攻击者也难以访问您的账户。本文中九河云将详细介绍如何在AWS Management Con…

云计算平台层(PaaS)指的是什么?常见的应用场景盘点

云计算平台层(PaaS)指的是什么&#xff1f;云计算平台层&#xff08;PaaS&#xff09;&#xff0c;全称PlatformasaService&#xff08;平台即服务&#xff09;&#xff0c;是云计算服务的一种重要模式。为用户提供了一个基于云端的开发和部署环境&#xff0c;允许用户开发、运…

C语言编译四大阶段

目录 一、引言 二、预处理阶段 三、编译阶段 四、汇编阶段 五、链接阶段 六、总结 本文将详细介绍C语言编译的四个阶段&#xff0c;包括预处理、编译、汇编和链接。通过学习这些阶段&#xff0c;读者可以更好地理解C语言程序的编译过程&#xff0c;提高编程效率。 一、引…

01DSP学习-了解DSP外设-以逆变器控制为例

(由于是回忆自己简单的DSP学习过程&#xff0c;所以博客看起来有些没有章法&#xff0c;请见谅~) 上一篇博客介绍了学习DSP需要的软件和硬件准备&#xff0c;以及一个DSP的工程包含了哪些东西。我的学习方法是目的导向&#xff0c;即我需要用什么我就学什么&#xff0c;并没有…

大数据新视界 --大数据大厂之Kubernetes与大数据:容器化部署的最佳实践

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

C++中的IO流

1. C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据&#xff0c;并将值存放在变量中。printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)。注意宽度输出和精度输出控制。C语言借助了相应的缓冲…