Java 比较器
Java比较器
自然排序java.lang.Comparable
1.像String、包装类等实现了Comparable接口,重写了compareTo()方法
2.利用Array.sort(Object obj)进行排序,调用comparaTo()方法
默认是从小到大升序
规则:
当前对象this大于形参obj时,返回正数
当前对象this小于形参obj时,返回负数
当前对象this等于形成obj时,返回0
这里按照规则重写方法,这样对对象就可以默认从小到大排序
技巧
如果本身>传入,且返回的是正数,那么就是按照升序排列(默认排序)
如果返回的是负数,就是按照降序排列。
(顺序是 本身 传入)
return 本身-传入 是升序 结果是正数表示要调整顺序,交换两个数 (顺序是 传入 本身 升序)
return 传入-本身 是降序 结果是负数表示不用交换顺序 (顺序是 本身 传入 降序)
@Override
public int comparaTo(Object o){
if(o instanceof Goods){
Goods goods = (Goods) o;
//方式一
if(this.price>goods.price){
return 1 ;
}else if(this.price<goods.price){
return -1;
}else{
return 0;
}
//方式二
return Double.compare(this.price,goods.price);
}
}
}
自定义排序java.util.Comparator
使用背景
1.元素的类型没有实现java.lang.Comparable接口而又不方便修改代码
2.实现了java.lang.Comparable接口的排序规则不适合当前的操作
实现
重写compare(Object o1,Object o2)方法,比较o1和o2的大小
//obj为需要比较的类
Arrays.sort(Object obj,new Comparator(){
//利用匿名实现类的方法
@Override
public int compare(Object o1,Object o2){
//具体的排序方法
}
})
compare返回值
1:表示要调整顺序,交换两个数
-1:不用调整顺序
Collections.sort(companyList, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if(o1.compareTo(o2) < 0 ){?}
});
如果你想升序,那么o1比o2小就是我想要的;所以返回-1,类比成false;表示我不想调整顺序
如果你想降序,那么o1比o2小不是我想要的;所以返回1,类比成true;表示我想调整顺序
案例
技巧
返回o1-o2 从小到大排序
返回o2-o1 从大到小排序
Arrays.sort(people, new Comparator<int[]>(){
@Override
public int compare(int[] o1,int[] o2){
if(o1[0]==o2[0]){
return o1[1]-o2[1];//默认是从小到大,返回负数说明o1[1]<o2[1],不用调整
}
return o2[0]-o1[0];
}
});