Comparable和Comparator都是用來實現集合中的排序的,Comparator位於包java.util下,而Comparable位於包java.lang下,Comparable是一個對象本身就已經支持自比較所需要實現的接口(如 String、Integer 自己就可以完成比較大小操作),是內部定義的排序;而後者在一個獨立的類中實現比較,是外部實現的排序。 如果一個類沒有實現Comparable接口,或是這個對象不支持自比較或者自比較函數不能滿足你的要求時,可以通過Comparator來實現比較算法進行排序,並且爲了使用不同的排序標準做準備,比如:升序、降序。所以,如想實現排序,就需要讓類對象自身實現Comparable接口,重寫其中的compareTo(T o)方法;或在外部定義比較器實現Comparator接口,重寫其compare(T o1,T o2)方法。前者只有一個參數,後者有兩個參數。排序時可以調用java.util.Arrays.sort()來排序對象數組,或是調用集合中的sort()方法就可以按照相應的排序方法進行排序。方法返回一個基本類型的整型,返回負數表示o1小於o2,返回0表示o1和o2相等,返回正數表示o1大於o2。
用 Comparator 是策略模式(strategy design pattern),就是不改變對象自身,而用一個策略對象(strategy object)來改變它的行爲。比如:你想對整數採用絕對值大小來排序,Integer 是不符合要求的,你不需要去修改 Integer 類(實際上你也不能這麼做)去改變它的排序行爲,只要使用一個實現了Comparator接口的對象來實現控制它的排序就行了。
import java.util.Arrays;
import java.util.Comparator;
class Person implements Comparable<Person>{
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;
}
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 {
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));
}
}
原文作者:happylifex
原文:https://blog.csdn.net/happylifex/rticle/details/44678341