Comparable接口(自然排序)
让排序的类本身去实现Comparable接口
为什么需要Comparable接口
对于基本变量类型可以使用< > = 来比较,但是对于其他类,却不行,所以需要使用比较接口并重写其中方法来实现比较
Comparable接口使用实例
String类以及包装类
String类以及包装类内部都已实现了Comparable接口中的compareTo(obj)方法,所以可以直使用比较排序 – 从小到大
自定义的类
自定义的类没有实现过Comparable接口,所以如果需要排序,需要实现compareTo(obj)方法,在compareTo(obj)中比较排序的方式
实现compareTo(obj)方法的规则
1.如果当前对象this大于形参obj,则返回正整数
2.如果当前对象this小于形参obj,则返回负整数
3.如果当前对象this等于形参obj,则返回零
e.g.
直接sort排序,没有实现Comparable接口
public class ComparableTest {
public static void main(String[] args) {
Person[] people = new Person[4];
people[0] = new Person(20,"张三");
people[1] = new Person(22,"李四");
people[2] = new Person(10,"王五");
people[3] = new Person(25,"赵六");
Arrays.sort(people);
System.out.println(Arrays.toString(people));
}
}
class Person{
private int age;
private String name;
public Person() {
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
}
结果: java.lang.ClassCastException类型转换异常,没有重写接口不能比较
重写了Comparable接口之后进行sort排序
public class ComparableTest {
public static void main(String[] args) {
Person[] people = new Person[4];
people[0] = new Person(20,"张三");
people[1] = new Person(22,"李四");
people[2] = new Person(10,"王五");
people[3] = new Person(25,"赵六");
Arrays.sort(people);
System.out.println(Arrays.toString(people));
}
}
class Person implements Comparable{
private int age;
private String name;
public Person() {
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
//指明人比较的方式,这里根据年龄从小到大进行排序
@Override
public int compareTo(Object o) {
if (o instanceof Person){
Person person = (Person)o;
if (this.age > person.age){
//this年龄大于形参的年龄 返回正整数
return 1;
}else if (this.age < person.age){
//this年龄小于形参的年龄 返回负整数
return -1;
}else {
return 0;
}
}
throw new ClassCastException("比较对象有误");
}
}