compareTo返回值为-1 、 1 、 0 的排序问题
1.什么是Comparable接口
此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序 ,类的 compareTo 方法被称为它的自然比较方法 。实现此接口的对象列表(和数组)可以通过 Collections.sort (和 Arrays.sort )进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。 强烈推荐(虽然不是必需的)使自然排序与 equals 一致。所谓与equals一致是指对于类 C 的每一个 e1和 e2 来说,当且仅当 (e1.compareTo((Object)e2) == 0) 与e1.equals((Object)e2) 具有相同的布尔值时,类 C 的自然排序才叫做与 equals 一致 。
2.实现什么方法
int compareTo(T o) 比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
强烈推荐 (x.compareTo(y)==0) == (x.equals(y)) 这种做法,但不是 严格要求这样做。一般来说,任何实现 Comparable 接口和违背此条件的类都应该清楚地指出这一事实。推荐如此阐述:“注意:此类具有与 equals 不一致的自然排序。”
参数: o - 要比较的对象。 返回:
负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。 抛出:
ClassCastException - 如果指定对象的类型不允许它与此对象进行比较。
3.实例
package test1; public class Note<T> implements Comparable<Note<T>> { private T data; //数据 private int weight; //权值 private Note<T> left; //左孩子 private Note<T> right; //右孩子 public Note(T data,int weight){ this.data=data; this.weight=weight; } @Override public String toString(){ return "data="+this.data+",weitht="+this.weight; } public T getData() { return data; } public void setData(T data) { this.data = data; } public int getWeight() { return weight; } public void setWeight(int weight) { this.weight = weight; } public Note<T> getLeft() { return left; } public void setLeft(Note<T> left) { this.left = left; } public Note<T> getRight() { return right; } public void setRight(Note<T> right) { this.right = right; } /** * 倒序排列。 */ @Override public int compareTo(Note<T> o) { if(o.weight>this.weight){ return 1; }else if(o.weight<this.weight){ return -1; } return 0; } /** * 升序排列 */ // @Override // public int compareTo(Note<T> o){ // if(this.weight>o.weight){ // return 1; // }else if(this.weight<o.weight){ // return -1; // } // return 0; // }
Ps:(快速记忆法)当前对象与后一个对象进行比较,如果比较结果为1进行交换,其他不进行交换。
当后一个对象比当前对象大,返回结果值为1时,前后交换,说明是倒序排列。
当后一个对象比当前对象小,返回结果值为1时,前后交换,说明是升序排列。