java設計模式,java設計模式pdf
[本文是自己學習所做筆記,歡迎轉載,但請註明出處:http://blog.csdn.net/jesson20121020]
繼續上節內容,到目前為至,其實已經很好的實現了對各種類型的數組進行排序,而且,擴充性也不錯,我們定義的比較子介面,可以適應不同的比較策略,但是我們注意到一點,在實現compare()方法時,我們需要向下轉型,將Object類型轉換成具體的類型,還是覺得有點麻煩,有沒有一種方法,使得我們在實現Comparator介面時就規定了具體要比較的類型呢?這時,我們很容易想到JDK中的<T> 泛型就能實現這種功能。所以,我們就將<T> 泛型應用在我們的比較子中,我們應用JDK中Comparator和Comparable到我們的程式,如下:
Cat.java
import java.util.Comparator;/** * Cat類 有屬性身高,體重及toString()方法 * * @author jesson * */public class Cat implements java.lang.Comparable<Cat> {private int height; // 身高private int weight; // 體重//private Comparator comparator = new CatHeightComparator(); // 高度比較子private Comparator<Cat> comparator = new CatWeightComparator(); // 重量比較子public Comparator getComparator() {return comparator;}public void setComparator(Comparator comparator) {this.comparator = comparator;}public Cat(int height, int weight) {// TODO Auto-generated constructor stubthis.height = height;this.weight = weight;}public int getHeight() {return height;}public void setHeight(int height) {this.height = height;}public int getWeight() {return weight;}public void setWeight(int weight) {this.weight = weight;}/** * 重寫toString()方法 */@Overridepublic String toString() {return this.getHeight() + "|" + this.getWeight();}/** * 實現Comparable介面的compareTO方法 * 調用具體的比較子進行比較大小 */@Overridepublic int compareTo(Cat o) {return comparator.compare(this, o);}}CatHeightComparator.java
import java.util.Comparator;/** * Cat類型高度比較子 * * @author jesson * */public class CatHeightComparator implements Comparator<Cat> {@Overridepublic int compare(Cat o1, Cat o2) {// TODO Auto-generated method stubif (o1.getHeight() > o2.getHeight())return 1;else if (o1.getHeight() < o2.getHeight())return -1;elsereturn 0;}}CatWeightComparator.java
import java.util.Comparator;/** * Cat類型重量比較子 * * @author jesson * */public class CatWeightComparator implements Comparator<Cat> {@Overridepublic int compare(Cat o1, Cat o2) {// TODO Auto-generated method stubif (o1.getWeight() > o2.getWeight())return -1;else if (o1.getWeight() < o2.getWeight())return 1;elsereturn 0;}}DataSorter
import java.lang.Comparable;/** * 排序類 * * @author jesson * */public class DataSorter {/** * 冒泡排序方法 * * @param Cat類型數組 */public static void bubbleSort(Object[] a) {for (int i = a.length - 1; i >= 1; i--) {for (int j = 0; j < i; j++) {Comparable o1 = (Comparable) a[j];Comparable o2 = (Comparable) a[j + 1];if (o1.compareTo(o2) == 1) {swap(a, j, j + 1);}}}}/** * 冒泡排序方法 * * @param a * 整數數組 */public static void bubbleSort(int[] a) {for (int i = a.length - 1; i >= 1; i--) {for (int j = 0; j < i; j++) {if (a[j] > a[j + 1]) {swap(a, j, j + 1);}}}}/** * 交換兩個資料 * * @param a * Object類型數組 * @param x * 數組下標1 * @param y * 數組下標2 */private static void swap(Object[] a, int x, int y) {// TODO Auto-generated method stubObject temp = a[x];a[x] = a[y];a[y] = temp;}/** * 交換兩個資料 * * @param a * 數組 * @param x * 數組下標1 * @param y * 數組下標2 */private static void swap(int[] a, int x, int y) {// TODO Auto-generated method stubint temp = a[x];a[x] = a[y];a[y] = temp;}/** * 列印數組 * * @param a * Object類型數組 */public static void print(Object[] a) {for (int i = 0; i < a.length; i++)System.out.print(a[i] + " ");System.out.println();}/** * 列印數組 * * @param a * int類型數組 */public static void print(int[] a) {for (int i = 0; i < a.length; i++)System.out.print(a[i] + " ");System.out.println();}}Test.java
/** * 測試類別 * @author jesson * */public class Test {public static void main(String[] args) {//int[] a = new int[]{9,8,2,4,5,6,7};Cat[] a = {new Cat(5,5),new Cat(1,1),new Cat(3,3)};//Dog[] a = {new Dog(3),new Dog(2),new Dog(6)};DataSorter.print(a);//DataSorter.bubbleSort(a);java.util.Arrays.sort(a);DataSorter.print(a);}} 可以看出,我們這裡沒有用自己定義的Comparable和Comparator,而是用JDK中的Comparable<T>和Comparator<T>介面,其實JDK已經封裝好了sort()方法,我們直接拿來用,但是有個前提,需要被排序的類要實現JDK的Comparable介面;所以在測試程式裡,我們可以直接用JDK中的sort(Object[] o)方法對我們定義的類型的數組進行排序。
以上,我們所寫的Comparable和Comparator介面只是用來類比JDK中的對應介面,在實際的開發過程中,我們一般直接拿來用即可。