Comparable和Comparator都是用來實現(xiàn)集合中的排序的,Comparator位于包java.util下,而Comparable位于包java.lang下,Comparable是一個對象本身就已經(jīng)支持自比較所需要實現(xiàn)的接口(如 String、Integer 自己就可以完成比較大小操作),是內部定義的排序;而后者在一個獨立的類中實現(xiàn)比較,是外部實現(xiàn)的排序。 如果一個類沒有實現(xiàn)Comparable接口,或是這個對象不支持自比較或者自比較函數(shù)不能滿足你的要求時,可以通過Comparator來實現(xiàn)比較算法進行排序,并且為了使用不同的排序標準做準備,比如:升序、降序。所以,如想實現(xiàn)排序,就需要讓類對象自身實現(xiàn)Comparable接口,重寫其中的compareTo(T o)方法;或在外部定義比較器實現(xiàn)Comparator接口,重寫其compare(T o1,T o2)方法。前者只有一個參數(shù),后者有兩個參數(shù)。排序時可以調用java.util.Arrays.sort()來排序對象數(shù)組,或是調用集合中的sort()方法就可以按照相應的排序方法進行排序。方法返回一個基本類型的整型,返回負數(shù)表示o1小于o2,返回0表示o1和o2相等,返回正數(shù)表示o1大于o2。
用 Comparator 是策略模式(strategy design pattern),就是不改變對象自身,而用一個策略對象(strategy object)來改變它的行為。比如:你想對整數(shù)采用絕對值大小來排序,Integer 是不符合要求的,你不需要去修改 Integer 類(實際上你也不能這么做)去改變它的排序行為,只要使用一個實現(xiàn)了Comparator接口的對象來實現(xiàn)控制它的排序就行了。
例子: import java.util.Arrays;import java.util.Comparator;class Person implements Comparable { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return this.name; } public int getAge() { return this.age; } @Override public String toString() { return ''+this.name+' '+this.age; } @Override public int compareTo(Person o) { if (this.getName().compareTo(o.getName()) != 0) return this.getName().compareTo(o.getName()); else { if (this.getAge() < o.getAge()) return -1; else if (this.getAge() > o.getAge()) return 1; else return 0; } }}class Cmp implements Comparator { @Override public int compare(Object arg0, Object arg1) { Person a = (Person) arg0; Person b = (Person) arg1; if (a.getName().compareTo(b.getName()) != 0) return a.getName().compareTo(b.getName()); else { if (a.getAge() < b.getAge()) return -1; else if (a.getAge() > b.getAge()) return 1; else return 0; } }}public class Main { public static void main(String[] args) { Person[] p = new Person[4]; p[0] = new Person('ZZZ',19); p[1] = new Person('AAA', 109); p[2] = new Person('AAA', 19); p[3] = new Person('YYY',100);// Arrays.sort(p);//調用自有的排序 Arrays.sort(p, new Cmp());//調用Comparator定義的排序 System.out.println(Arrays.toString(p)); }}
|