标签:使用 设计模式 err 定义 image pareto sys 容器 public
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接口,在后面的时间里再给大家介绍这个接口
最后,以上是我个人学习所得以及个人结论,如有不对的对方欢迎大家指出,在此感谢
标签:使用 设计模式 err 定义 image pareto sys 容器 public
原文地址:http://www.cnblogs.com/lin-/p/8006712.html