持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
比较器的概念
比较器在C++里叫重载比较运算符,改写比较的规则(改写什么叫大于号,什么叫小于号)
在Java中叫比较器,Java中的对象,正常情况下,只能进行比较:==或!=,不能使用>或<,但是在开发场景中,我们需要对多个对象进行排序,言外之意,就需要比较对象的大小,如何实现呢?这就需要使用Comparable接口(若一个类实现了Comparable接口,就意味着“该类支持排序”, 作用在实体类上, 同时也被称之为内部比较器)或Compartor接口(我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序,作用在排序类上,同时也被称之为外部比较器)。
- 比较器的实质就是重载比较运算符
- 比较器可以很好的应用在特殊标准的排序上
- 比较器可以很好的应用在根据特殊标准排序的结构上
比较器的默认规则
- 返回负数的时候,第一个参数排在前面
- 返回正数的时候,第二个参数排在前面
- 返回0的时候,谁在前面无所谓
java中的示例
举个例子:现在有一堆学生数据,我们需要对其进行排序,排序规则就是按id升序。
// 定义一个升序比较器
public static class IdAscendingComparator inplements Comparator<Student>{
public int compare(Student o1, Student O2){
// if(o1.id < o2.id) return -1;
// if(o1.id > o2.id) return 1;
// return 0;
// 上述三行代码可以简写成:
return o1.id - o2.id
}
}
Student student1 = new Student("A", 2, 20); // 三个参数分别代表name,id,age
Student student2 = new Student("B", 3, 21);
Student student3 = new Student("C", 1, 22);
Student[] students = new Student[]{student1, student2, student3}
Array.sort(student, new IdAscendingComparator()); // 第二个参数就是比较规则
javascript中的示例
当我们想把一个由数字组成的数组进行简单的排序时,可能会想到sort()方法:
var arr = [2 , 3, -1, -107, -14, 1];
console.log(arr.sort())
结果:
[-1, -107, -14, 1, 2, 3]
这样显然是有问题的,因为调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,也就是按照字符编码的顺序进行排序。
所以我们需要一个比较器:
console.log(arr.sort(function(a,b){
if(a<b){
return -1;
}
if(a>b){
return 1;
}
return 0;
}))
结果:
[-107, -14, -1, 1, 2, 3]
这样子看起来就好多了~所以我们在使用sort()方法对数组进行排序时要注意它的规则。
定义升序的比较器
var arr=[2,23,3,226,123,1,12];
//Step1:定义比较器函数
function compareASC(a,b){
return a-b;
}
//Step2:将函数作为参数传入sort方法
arr.sort(compareASC);
定义降序的比较器
function compareDESC(a,b){
return b-a;
}
arr.sort(compareDESC);
相关链接
对于比较器,叫法或应用大同小异,可以看相关链接进行了解:
C++ 重载运算符和重载函数-菜鸟教程