如果想为一组对象进行排序,那么必须有一个可以区分出对象大小的关系操作,这个操作在Java中就是利用比较器完成的,java中提供了两种比较器支持:java.long.Comparable和java.util.Comparator
1.如果要为对象指定比较规则,那么对象所在的类必须实现Comparable接口.
public interface Comparable<T>{
public int compareTo(T o);
}
在这个接口中提供了一个compareTo()方法:要排序的数组所在的类一定要实现此接口,此接口返回的是int型数据,而用户覆写方法时只需要返回3中结果:1(>0)、-1(<0)、0(=0).
String类为Comparable接口子类.所以在String类中提供了compaTo()方法进行字符串的大小比较.
实现比较器
在定义Person类时多实现了一个Comparable接口,而实现此接口就可以通过Arrays类的sort()方法进行数组排序了,所以以后不管哪种情况,只要牵扯到对象数组排序的操作,永远都要使用比较器COmparable
package class5;
import java.lang.reflect.Array;
import java.util.Arrays;
class Person implements Comparable<Person>{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Person o) {
if(this.age>o.age){
return 1;
}else if (this.age<o.age){
return -1;
}else {
return 0;
}
}
}
public class TestDeao7 {
public static void main(String[] args) {
Person person[]=new Person[]{new Person("芷若",20),
new Person("佳宁",18),
new Person("姑姑",22)
};
Arrays.sort(person);
System.out.println(Arrays.toString(person));
}
}
运行实例
挽救的比较器
Comparable比较器实际上是在一个类定义时就具备的功能,那么如果现在已经定义好的类该如何排序
已经定义好的类
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
此时没有考虑排序要求,但是后来需要进行排序,但是类已经无法修改了,那么如何使用Arrays.sort()排序呢?为了解决这个问题,java提供了另外一个比较接口:java.util.Comparator接口,这个接口如下定义:
compare()方法存在两个参数用于比较大小,而想要使用这个接口,需要定义比较规则类.
public interface Comparator<T>{
public int compare(T o1,T o2);
public boolean equals(Object obj);
}
定义Person类的补救比较规则类.
class PersonComparator implements Comparator<Person> {
@Override
public int compare(Person o1,Person o2) {
if(o1.getAge()>o2.getAge()){
return 1;
}else if (o1.getAge()<o2.getAge()){
return -1;
}else {
return 0;
}
}
}
而如果进行排序的话,依然使用Arrays类的sort()方法,只是方法需要更换.
使用Comparator比较:public static void sort(T[]a,Comparator<?super T>c)
实现排序
public class TestDeao7 {
public static void main(String[] args) {
Person person[]=new Person[]{new Person("芷若",20),
new Person("佳宁",18),
new Person("姑姑",22)
};
Arrays.sort(person,new PersonComparator());//对象数组排序
System.out.println(Arrays.toString(person));
}
}
java.lang.Comparable 是在一个类定义时默认实现好的接口,里面只要一个compareTo()方法;
java.lang.Comparator是需要单独定义一个比较规则类,里面有两个方法:compare()和equals().