简单介绍Java中Comparable和Comparator
轉載自?簡單介紹Java中Comparable和Comparator
Comparable?和?Comparator是Java核心API提供的兩個接口,從它們的名字中,我們大致可以猜到它們用來做對象之間的比較的。但它們到底怎么用,它們之間有又哪些差別呢?下面有兩個例子可以很好的回答這個問題。下面的例子用來比較HDTV的大小??赐晗旅娴拇a,相信對于如何使用Comparable和Comparator會有一個更加清晰的認識。
Comparable
一個實現了Comparable接口的類,可以讓其自身的對象和其他對象進行比較。也就是說,同一個類的兩個對象之間要想比較,對應的類就要實現Comparable接口,并實現compareTo()方法,代碼如下:
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;}@Overridepublic int compareTo(HDTV tv) {if (this.getSize() > tv.getSize())return 1;else if (this.getSize() < tv.getSize())return -1;elsereturn 0;} }public class Main {public static void main(String[] args) {HDTV tv1 = new HDTV(55, "Samsung");HDTV tv2 = new HDTV(60, "Sony");if (tv1.compareTo(tv2) > 0) {System.out.println(tv1.getBrand() + " is better.");} else {System.out.println(tv2.getBrand() + " is better.");}} }輸出結果:
Sony is better.Comparator
在一些情況下,你不希望修改一個原有的類,但是你還想讓他可以比較,Comparator接口可以實現這樣的功能。通過使用Comparator接口,你可以針對其中特定的屬性/字段來進行比較。比如,當我們要比較兩個人的時候,我可能通過年齡比較、也可能通過身高比較。這種情況使用Comparable就無法實現(因為要實現Comparable接口,其中的compareTo方法只能有一個,無法實現多種比較)。
通過實現Comparator接口同樣要重寫一個方法:compare()。接下來的例子就通過這種方式來比較HDTV的大小。其實Comparator通常用于排序。Java中的Collections和Arrays中都包含排序的sort方法,該方法可以接收一個Comparator的實例(比較器)來進行排序。
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> {@Overridepublic 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());}} }輸出結果:
Panasonic Samsung Sony以上代碼就實現了通過自定義一個比較器(Comparator)來實現對一個列表進行排序。
我們也經常會使用Collections.reverseOrder()來獲取一個倒序的Comparator。例如:
ArrayList<Integer> al = new ArrayList<Integer>(); al.add(3); al.add(1); al.add(2); System.out.println(al); Collections.sort(al); System.out.println(al);Comparator<Integer> comparator = Collections.reverseOrder(); Collections.sort(al,comparator); System.out.println(al);輸出結果:
[3,1,2] [1,2,3] [3,2,1]如何選擇
簡單來說,一個類如果實現Comparable接口,那么他就具有了可比較性,意思就是說它的實例之間相互直接可以進行比較。
通常在兩種情況下會定義一個實現Comparator類。
1、如上面的例子一樣,可以把一個Comparator的子類傳遞給Collections.sort()、Arrays.sort()等方法,用于自定義排序規則。
2、用于初始化特定的數據結構。常見的有可排序的Set(TreeSet)和可排序的Map(TreeMap)
下面通過這兩種方式分別創建TreeSet。
使用Comparator創建TreeSet
class Dog {int size;Dog(int s) {size = s;} }class SizeComparator implements Comparator<Dog> {@Overridepublic int compare(Dog d1, Dog d2) {return d1.size - d2.size;} }public class ImpComparable {public static void main(String[] args) {TreeSet<Dog> d = new TreeSet<Dog>(new SizeComparator()); // pass comparatord.add(new Dog(1));d.add(new Dog(2));d.add(new Dog(1));} }這里使用的就是Comparator的第二種用法,定義一個Comparator的子類,重寫compare方法。然后在定義HashSet的時候,把這個類的實例傳遞給其構造函數。這樣,再使用add方法向HashSet中增加元素的時候,就會按照剛剛定義的那個比較器的邏輯進行排序。
使用Comparable創建TreeSet
class Dog implements Comparable<Dog>{int size;Dog(int s) {size = s;}@Overridepublic int compareTo(Dog o) {return o.size - this.size;} }public class ImpComparable {public static void main(String[] args) {TreeSet<Dog> d = new TreeSet<Dog>();d.add(new Dog(1));d.add(new Dog(2));d.add(new Dog(1));} }這里,定義TreeSet的時候并沒有傳入一個比較器。但是使用add方法向HashSet中增加的對象是一個實現了Comparable的類的實例。所以,也能實現排序功能。
總結
以上是生活随笔為你收集整理的简单介绍Java中Comparable和Comparator的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nas和电脑怎么直连?
- 下一篇: j1800做群晖够用吗?