平时刷算法的时候有时候需要使用到升序降序排序,这个地方我老是会出现记忆错误,死记硬背这个升降序写法,所以这里我讲述一种我自认为比较好的记忆方法。
前提:这里o1表示位于前面的对象,o2表示后面的对象
实现Comparator接口,必须实现下面这个函数:
@Override
public int compare(CommentVo o1, CommentVo o2) {
return o1.getTime().compareTo(o2.getTime());
}
我们认为:
return 正数 此时表示两个对象需要交换位置
return 负数 此时表示两个对象不需要交换位置
常用的方法是:
升序(asc)
return o1.xxx - o2.xxx;(这里o1表示位于前面的对象,o2表示后面的对象)
升序原因:
首先o1是前面的对象,o2是后面的对象。
如果o1-o2>0,表示此时return 正数,o1,o2需要交换位置,而又因为o1-o2>0,所以o1>o2.
而此时需要交换位置,交换位置后此时o2在o1前面,o2<o1,所以是升序。
如果o1 - o2 <0 ,此时表示return 负数,o1,o2不需要交换位置,而又因为o1- o2<0,所以o1<o2。
因为不需要交换位置,此时o1任然在前面,o2任然在后面,而o1<o2,也是升序的。
因此 return o1.xxx - o2.xxx表示是升序。
降序(desc)
return o2.xxx - o1.xxx;(这里o1表示位于前面的对象,o2表示后面的对象)
降序原因:
首先o1是前面的对象,o2是后面的对象。
如果o2-o1>0,表示此时return 正数,o1,o2需要交换位置,而又因为o2-o1>0,所以o2>o1.
而此时需要交换位置,交换位置后此时o2在o1前面,o2>o1,所以是降序。
如果o2 - o1 <0 ,此时表示return 负数,o1,o2不需要交换位置,而又因为o2- o1<0,所以o2<o1。
因为不需要交换位置,此时o1任然在前面,o2任然在后面,而o1>o2,也是降序的。
因此 return o1.xxx - o2.xxx表示是降序。
警惕点:
这里return o1.xxx - o2.xxx 可能会出现越界的情况,例如 o1.xxx = 2147483646;o2.xxx = -2147483646; 此时相减的话会越界。
因此使用传统方法判断,
例如:
if(a[0]>b[0]){
return 1;
}else if(a[0]<b[0]){
return -1;
}else{
return 0;
}
这样也是升序,其实这里两个对象前后顺序不变即可。