天天看點

JAVA自定義比較器Comparator 和 Comparable

JAVA有兩種比較器,分别是:Comparator 和 Comparable

我看網上說Comporable是内部比較器,而Comparator是外部比較器,由于這兩個都是接口,是以都需要去實作,而實作Comporable接口則需要實作compareTo方法,實作Comparator需要實作compare方法。Comparable接口一般由要比較的類實作,是以叫内部比較器,而comparator比較器一般是單獨實作,或者匿名内部類實作。

例如:

public class Person implements Comparable<Person> {
	int age;
	public Person(int age) {
		this.age = age;
	}
	@Override
	public int compareTo(Person person) {
		// TODO Auto-generated method stub
		return this.age - person.age;
	}
}
           

測試代碼:

public class TestComparator {
public static void main(String[] args) {
		List<Person> list = new ArrayList<>();
		list.add(new Person(12));
		list.add(new Person(9));
		list.add(new Person(10));
		list.add(new Person(22));
		System.out.println("排序前:");
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i).age + "  ");
		}
		System.out.println("排序後:");
		Collections.sort(list);
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i).age + "  ");
		}
	}
}
           

運作結果:

排序前:
12  9  10  22  
排序後:
9  10  12  22  
           

自定義比較器:

public class myComparator implements Comparator<Person> {

	@Override
	public int compare(Person p1, Person p2) {
		// TODO Auto-generated method stub
		return p2.age - p1.age;
	}

}
           

然後在比較的時候把它給傳過去:

//接上面的測試方法
	System.out.println("\n" + "使用自定義比較器排序後:");
		Collections.sort(list, new myComparator());
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i).age + "  ");
		}
           

運作結果如下:

排序前:
12  9  10  22  
排序後:
9  10  12  22  
使用自定義比較器排序後:
22  12  10  9  
           

綜上,兩者的差別是實作Comparator接口代碼更加靈活,可以定義某個類的多個比較器,進而在排序時根據實際場景自由調用,而Comparable接口實作後便不能改動