如果想爲一組對象進行排序,那麼必須有一個可以區分出對象大小的關係操作,這個操作在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().