Collections.sort() 和 Arrays.sort()方法能夠對Object數組進行排序,可是這種方法排序要求對象所在的類必須實現Comparable接口,此接口用於指定排序規則html
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class HDTV implements Comparable<HDTV> { private int size; private String brand; public HDTV(int size, String brand) { this.size = size; this.brand = brand; } public int getSize() { return size; } public void setSize(int size) { this.size = size; } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } @Override public int compareTo(HDTV tv) { if (this.getSize() > tv.getSize()) return 1; else if (this.getSize() < tv.getSize()) return -1; else return 0; } public static void main(String[] args) { HDTV tv1 = new HDTV(55, "Samsung"); HDTV tv2 = new HDTV(60, "Sony"); HDTV tv3 = new HDTV(35, "Apple"); List<HDTV> list = new ArrayList<HDTV>(); list.add(tv1);list.add(tv2);list.add(tv3); Collections.sort(list); for (HDTV tv : list) { System.out.println(tv.getSize()+"---"+tv.getBrand()); } }
若是一個類已經開發完成,可是在此類創建的初期並無實現Comparable接口,此時確定是沒法進行對象排序操做的,因此爲了解決這個問題,java定義了另外一個比較器的操做接口--Comparatorjava
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; class HDTV { private int size; private String brand; public HDTV(int size, String brand) { this.size = size; this.brand = brand; } public int getSize() { return size; } public void setSize(int size) { this.size = size; } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } } class SizeComparator implements Comparator<HDTV> { @Override public int compare(HDTV tv1, HDTV tv2) { int tv1Size = tv1.getSize(); int tv2Size = tv2.getSize(); if (tv1Size > tv2Size) { return 1; } else if (tv1Size < tv2Size) { return -1; } else { return 0; } } } public class Main { public static void main(String[] args) { HDTV tv1 = new HDTV(55, "Samsung"); HDTV tv2 = new HDTV(60, "Sony"); HDTV tv3 = new HDTV(42, "Panasonic"); ArrayList<HDTV> al = new ArrayList<HDTV>(); al.add(tv1); al.add(tv2); al.add(tv3); Collections.sort(al, new SizeComparator()); for (HDTV a : al) { System.out.println(a.getBrand()); } }
}數組
總結:
Comparable 是一個對象自己就已經支持自比較所須要實現的接口(如 String、Integer 本身就能夠完成比較大小操做,已經實現了Comparable接口)ide
用 Comparator 是策略模式(strategy design pattern),就是不改變對象自身,而用一個策略對象(strategy object)來改變它的行爲this
參考:Comparable vs Comparator in Java.net
其餘資料:
Comparable與Comparator的區別code