Comparable

Posted 墨小雨的猫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Comparable相关的知识,希望对你有一定的参考价值。

jdk1.2新增的接口,位于java.lang包下。在jdk5时Comparable<Object>改成了Comparable<T>

功能:用于对象的排序或者对象的分组

介绍:Comparable接口强行对实现它的类的每个实例进行自然排序,该接口的唯一方法compareTo方法被称为自然比较方法;强烈建议自然排序和equals一致(就是两个对象调用compareTo方法和调用equals方法返回的布尔值应该一样)

方法: int compareTo(Object   o)  

利用当前对象和传入的目标对象进行比较,若是当前对象比目标对象大,则返回1,那么当前对象会排在目标对象的后面

                      若是当前对象比目标对象小,则返回-1,那么当前对象会排在目标对象的后面

                       若是两个对象相等,则返回0

 

例子①:对狗狗按照年龄进行升序排序

public class Main {
public static void main(String[]args){
List list = new ArrayList();
list.add(new Dog(6,"旺财"));
list.add(new Dog(3,"皮诺"));
list.add(new Dog(5,"子弹"));

for(int i=0;i<list.size();i++){
System.out.println(list.get(i).toString());
}
Collections.sort(list);
System.out.println("调用sort排序后");
for(int i=0;i<list.size();i++){
System.out.println(list.get(i).toString());
}

}
}

class Dog implements Comparable{
public int age;
public String name;
public Dog(int age,String name){
this.age=age;
this.name=name;
}

@Override
public String toString(){
return "Dog [age="+age+",name="+name+"]";
}

@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
Dog d =(Dog)o;
if(this.age>d.age) return 1;
if(this.age<d.age) return -1;
return 0;
}
}

输出结果:

思考:如何进行降序呢?

     答:在重写compareTo方法时,可以反过来写,如果当前狗狗的年龄对目标狗狗的年龄大的话,则返回-1。这样就可以达到降序的目的

 

例子①扩展:

如果使用一些自带排序的集合容器,那么还会按照我们compareTo中定义的那样来排序吗?

仅对主函数进行修改

public class Main {
public static void main(String[]args){
Set<Dog> set = new TreeSet();
set.add(new Dog(6,"旺财"));
set.add(new Dog(3,"皮诺"));
set.add(new Dog(5,"子弹"));

for(Dog d:set){
System.out.println(d.toString());
}

}
}

输出结果:

由此可得结论:若是A类实现了Compareble接口,并且重写了compareTo()方法

        ①:当你在使用Collections/Arrays的sort对该A的对象集合进行排序时,它会按照compareTo()方法中定义的那样进行排序

        ②:当你使用会自动排序的容器(TreeSet、TreeMap)来存A的对象时,它也会按照compareTo()方法中定义的那样进行排序

        ③:这个只是简单的根据年龄进行比较,在一些场景下可以写的更丰富,比如在年龄相等的情况下根据其他的东西进行排序等

 

质疑:网上很多人都说Comparable是一个排序的接口,事实真的是如此吗?

解答:因为Comparable在排序上用的比较多,所以很多人对它有误解。其实Comparable是一个比较器,只是用来比较两个对象的区别,除了排序,它还可以用来进行分组(还有其他作用,这里不深究)

 

缺点:Comparable和目标类的耦合度太高,如果对比较算法不满意,或者目标类没有实现Comparable接口,就得对原来的代码进行修改,这一点不符合设计模式的开闭原则(对扩展开放,对修改关闭)

    因此在这里引入Comparator接口,在后面的时间里再给大家介绍这个接口

 

最后,以上是我个人学习所得以及个人结论,如有不对的对方欢迎大家指出,在此感谢

 

以上是关于Comparable的主要内容,如果未能解决你的问题,请参考以下文章

Comparable和Comparator的区别

comparator comparable区别

Java比较器

Java比较器

Java比较器

Java比较器