說(shuō)到現(xiàn)在,讀者應(yīng)該對(duì)Comparable接口有了大概的了解,但是為什么又要有一個(gè)Comparator接口呢?難道Java的開(kāi)發(fā)者都吃飽撐著沒(méi)事做嗎?
再談Comparator接口之前,大家應(yīng)該先了解一個(gè)叫“策略模式”的東東。一下是百度百科對(duì)策略模式的描寫:
之所以要談到策略模式,就是因?yàn)镃omparator接口其實(shí)就是一種策略模式的實(shí)踐。實(shí)現(xiàn)Comparator接口的類必然就會(huì)實(shí)現(xiàn)一個(gè)compareTo(Object o1, Object o2)的方法,而這個(gè)方法就是算法中的一部分,所有使用了compareTo方法的類都不會(huì)關(guān)心compareTo是如何工作的,只關(guān)心他的返回值,這也是面向?qū)ο笾兄姆庋b特性。
那Comparator接口應(yīng)該如何使用呢?別急,首先我們要先對(duì)Person類進(jìn)行一下處理,因?yàn)槲覀儸F(xiàn)在使用Comparator接口,所以Comparable接口就可以光榮的退休了:
1: public class Person {
2:
3: private String name;
4: private int age;
5:
6: public Person() {
7:
8: }
9:
10: public Person(String name, int age) {
11: this.name = name;
12: this.age = age;
13: }
14:
15: public String getName() {
16: return name;
17: }
18:
19: public void setName(String name) {
20: this.name = name;
21: }
22:
23: public int getAge() {
24: return age;
25: }
26:
27: public void setAge(int age) {
28: this.age = age;
29: }
30:
31: @Override
32: public String toString() {
33: return "Person [age=" + age + ", name=" + name + "]";
34: }
35:
36: }
新建一個(gè)實(shí)現(xiàn)Comparator的實(shí)現(xiàn)類PersonComparator:
1: import java.util.Comparator;
2:
3: public class PersonComparator implements Comparator<Person> {
4:
5: @Override
6: public int compare(Person p1, Person p2) {
7: if (p1.getAge() > p2.getAge()) {
8: return 1;
9: } else if (p1.getAge() < p2.getAge()) {
10: return -1;
11: }
12: return 0;
13: }
14:
15: }
然后再用回我們的CompareTest做測(cè)試:
1: import java.util.Arrays;
2:
3: public class CompareTest {
4:
5: public static void main(String[] args) {
6: Person[] persons = {
7: new Person("P1", 60),
8: new Person("P2", 20),
9: new Person("P3", 40)
10: };
11:
12: System.out.println(Arrays.toString(persons));
13:
14: Arrays.sort(persons, new PersonComparator());
15:
16: System.out.println(Arrays.toString(persons));
17: }
18:
19: }
注意:在上面的sort方法中,我們傳進(jìn)了一個(gè)PersonComparator的實(shí)例對(duì)象作為參數(shù),讀者也可以試試不傳入這個(gè)參數(shù),看是否能正確工作。
結(jié)果當(dāng)然是跟上面演示的例子一樣啦,我就不再重復(fù)了。