Java6.0中Comparable接口与Comparator接口详解
說到現(xiàn)在,讀者應(yīng)該對Comparable接口有了大概的了解,但是為什么又要有一個Comparator接口呢?難道Java的開發(fā)者都吃飽撐著沒事做嗎?
再談Comparator接口之前,大家應(yīng)該先了解一個叫“策略模式”的東東。一下是百度百科對策略模式的描寫:
策略模式定義了一系列的算法,并將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而獨(dú)立變化。(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.)?
之所以要談到策略模式,就是因?yàn)镃omparator接口其實(shí)就是一種策略模式的實(shí)踐。實(shí)現(xiàn)Comparator接口的類必然就會實(shí)現(xiàn)一個compareTo(Object o1, Object o2)的方法,而這個方法就是算法中的一部分,所有使用了compareTo方法的類都不會關(guān)心compareTo是如何工作的,只關(guān)心他的返回值,這也是面向?qū)ο笾兄姆庋b特性。
那Comparator接口應(yīng)該如何使用呢?別急,首先我們要先對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: }新建一個實(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做測試:
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)了一個PersonComparator的實(shí)例對象作為參數(shù),讀者也可以試試不傳入這個參數(shù),看是否能正確工作。
結(jié)果當(dāng)然是跟上面演示的例子一樣啦,我就不再重復(fù)了
總結(jié)
以上是生活随笔為你收集整理的Java6.0中Comparable接口与Comparator接口详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【3】python核心编程 第六章-序列
- 下一篇: IOS学习动画二之 Core Anim