对象数组排序
内容介绍
1.对象数组直接调用sort()方法报错的原因:
是因为没有定义比较的规则,需要自己定义。
2.如何定义规则?看报错信息:
ClassCastException: demoCompare.Person cannot be cast to java.lang.Comparable
表达的意思就是:
当前比较的对象的那个类没有实现Comparable
接口,在接口中需要定义比较的规则。
这个接口就是比较器接口
3.比较规则:
如果方法返回正整数:表示调用者大于参数对象。
如果方法返回负整数:表示调用者小于参数对象 。
如果方法返回0:表示两个对象相等。
4.比较原理:
用Arrays.sort()
方法去排序一个对象数组,那么sort()
方法里面会自动拿出每一个对象去跟其他对象进行调用比较器接口的compareTo()
方法进行比较。
两种比较器
1.Comparable接口
在实体类中覆写compareTo
方法,定义自己的比较规则。
演示代码如下:
1.Person.java实体类
package demoCompare;
public class Person implements Comparable<Person> {
public String name;
public int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
// 先按age升序排序,再按name升序排序
@Override
public int compareTo(Person o) {
if (this.age > o.age) {
return 1;
}
if (this.age < o.age) {
return -1;
}
// 调用String的compareTo()方法,Java帮我们写好了
return this.name.compareTo(o.name);
}
}
2.Test.java测试类
public static void main(String[] args) {
Person[] ps = { new Person("ab", 15), new Person("ad", 13), new Person("ac", 14), new Person("aa", 14) };
Arrays.sort(ps);
System.out.println(Arrays.toString(ps));
}
2.Comparator接口
问:如果要比较的对象数组里面的对象对应的类,不是我们自定义的,而是面试时别人提供好的class文件,我们无法修改代码,而这个类又没有实现比较器接口,怎么比较?
答:可以使用第三方比较的类。
用Comparator接口覆写Compare方法。调用sort()
方法时,把第三方比较类的对象传入第二个参数使用,sort()
自动调用。
这样我们不需要修改实体类的代码!
演示代码如下:
1.Person.java实体类
package demoCompare;
public class Person {
public String name;
public int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
2.MyCompare.java排序类
package demoCompare;
import java.util.Comparator;
public class MyCompare implements Comparator<Person> {
// 排序规则:
// 先age升序排序
// 再name降序排序
@Override
public int compare(Person o1, Person o2) {
if (o1.age > o2.age) {
return 1;
}
if (o1.age < o2.age) {
return -1;
}
return o1.name.compareTo(o2.name);
}
}
3.Test.java测试类
public static void main(String[] args) {
Person[] ps = { new Person("ab", 15), new Person("ad", 13), new Person("ac", 14), new Person("aa", 14) };
Arrays.sort(ps);
System.out.println(Arrays.toString(ps));
}