java Comparable<>_Comparable

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

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

介绍: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

System.out.println(list.get(i).toString());

}

Collections.sort(list);

System.out.println("调用sort排序后");

for(int i=0;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

return 0;

}

}

输出结果:

a324ddcc3e284925cfe760b973ccdbc0.png

思考:如何进行降序呢?

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

例子①扩展:

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

仅对主函数进行修改

public class Main {

public static void main(String[]args){

Set 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());

}

}

}

输出结果:

dbfad7210d5b8dd9d3bd80e5a62ef8de.png

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

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

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

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

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

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

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

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

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

Java中的Comparable接口定义了一个compareTo方法,用于比较类的对象之间的大小关系。实现Comparable接口的类可以使用Arrays.sort()和Collections.sort()进行排序。 实现Comparable接口的类需要重写compareTo方法,该方法返回一个整数值,表示当前对象与另一个对象的大小关系。如果当前对象小于另一个对象,则返回负整数;如果当前对象等于另一个对象,则返回0;如果当前对象大于另一个对象,则返回正整数。 以下是一个示例实现Comparable接口的类: ``` public class Person implements Comparable<Person> { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public int compareTo(Person o) { return this.age - o.getAge(); } } ``` 在上面的示例中,Person类实现了Comparable接口,并重写了compareTo方法。该方法比较两个Person对象的年龄大小关系。 如果要对Person对象进行排序,可以使用Arrays.sort()或Collections.sort()方法。例如: ``` Person[] persons = new Person[] { new Person("Tom", 25), new Person("Jack", 18), new Person("Mary", 30) }; Arrays.sort(persons); for (Person person : persons) { System.out.println(person.getName() + " " + person.getAge()); } ``` 该示例中,使用Arrays.sort()对Person对象数组进行排序,按照年龄从小到大排序。最后输出排序后的结果。 需要注意的是,实现Comparable接口的类必须能够比较大小,否则可能会抛出ClassCastException异常。因此,在重写compareTo方法时,应该考虑到类的属性是否可以比较大小。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值