一.compare实现了Comparator接口,compareTo实现了compareable接口。它们可以给对象和基本类型进行排序。给基本类型排序可以直接调用Arrays.sort()和Conllections.sort()方法直接排序,默认是升序的。降序和对象排序需要重写相应的方法。
二.
public int compareTo(Student o) {
return this.age - o.age; // 比较年龄(年龄的升序) 需要降序直接改为return o.age-this.age;
}
public int compare(Integer o1, Integer o2) {
需要降序直接 return o2-o1;
}
使用compareTo的时候需要在比较的实体类中实现
compareable接口,并重写compareTo()方法,compareTo()通常用来进行对象的比较排序。
compare()通常用来给基本类型进行比较排序,但也可以给对象进行比较排序。
三.为什么this.age - o.age和
o1-o2是升序?注意sort里面默认就是升序,这点一定要记住。
compare函数的返回值-1、1、0是什么个意思?
返回值为-1, 表示左边的数比右边的数小,左右的数不进行交换。
返回值为0, 表示左边的数等于右边的数,左右的数不进行交换。
返回值为1, 表示左边的数比右边的数大,左右的数进行交换。(不进行交换的话,就没办法维持升序).
上面的例子中this.age可以理解成左边的数,o.age可以理解成右边的数。
this.age-o.age>0 说明左边的数比右边的数大,return this.age-o.age 返回的是一个正数,就进行左右交换,所以最终输出是升序。
this.age-o.age<0 说明左边的数比右边的数小,return this.age-o.age 返回的是一个负数,不用进行交换,所以最终输出是升序。
四.当要对象多个值进行比较的时候一定要重写compareTo或者compare方法
例如1:在实体类要实现
成绩按从高到低排序,成绩相等按年龄从小到大排序。
public int compareTo(Student stu){
if(this.score>stu.score){
return -1 ; //这里返回-1是因为左边大于右边,本来就是降序,我们就不用进行左右替换
}else{
}else if(this.score<stu.score){
return 1 ; //这里返回1是因为左边小于右边,我们需要降序,那么返回1就可以进行左右替换
}else{
if(this.age>stu.age){
return 1 ;
}else if(this.age<stu.age){
return -1 ;
}else{
return 0 ;
}
}
}
备注:你可以根据第三点记做在if判断中的条件中左边和右边的情况本来就跟你需求升序还是降序一样那么就renturn -1左右就不用替换 否则return 1,那么左右需要换位,默认的是升序,你就不会记混了。compare()方法重写你也可以这么记。
Collections.sort(list, new Comparator<Menu>() {
@Override
public int compare(Menu o1, Menu o2) {
return o1.compareTo(o2);
}
});
compare可以配合compareTo一起使用,但是compareTo需要在对应的实体类重写该方法。
@Override
public int compareTo(Menu o) {
if(Integer.valueOf(this.id) > Integer.valueOf(o.id)){
return -1;
}else if(Integer.valueOf(this.id) < Integer.valueOf(o.id)){
return 1;
}else {
return 0;
}
}
这是id降序的写法,也可以直接
@Override
public int compareTo(Menu o) {
return o.id.compareTo(this.id);
}