Comparable是一个内比较器、是一个排序接口,实现Comparable接口的类可以自己和自己比较大小且表示该实现类支持排序,具体大小比较依赖Comparable中compareTo()方法的实现,接口实现:
package com.luna.model.strategy; public interface Comparable { public int compareTo(Object o); }
Comparator是一个外比较器,是一策略模式的典型实现,当想比较的两个类没有实现Comparable接口或者compareTo()方法不支持自己想要的比较方式时,就可以使用Comparator,Comparator接口实现:
package com.luna.model.strategy; public interface Comparator { int compare(Object o1,Object o2); }
Comparable的具体实现类Cat:
package com.luna.model.strategy; public class Cat implements Comparable{ private String name; private int height; private int weight; private Comparator comparator = new CatWeightComparator(); //使用外比较器Comparator来实现Comparable接口的compareTo方法 public Comparator getComparator() { return comparator; } public void setComparator(Comparator comparator) { this.comparator = comparator; } public Cat() { super(); } public Cat(String name, int height, int weight) { super(); this.name = name; this.height = height; this.weight = weight; } public String getName() { return name; } public void setName(String name) { this.name = name; } 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; } @Override public String toString() { return "Cat [name=" + name + ", height=" + height + ", weight=" + weight + "]"; } @Override public int compareTo(Object o) { return comparator.compare(this, o); } }
Comparable的具体实现类Dog:
package com.luna.model.strategy; public class Dog implements Comparable{ private String name; private int height; private int weight; public Dog() { super(); } public Dog(String name, int height, int weight) { super(); this.name = name; this.height = height; this.weight = weight; } public String getName() { return name; } public void setName(String name) { this.name = name; } 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; } @Override public String toString() { return "Cat [name=" + name + ", height=" + height + ", weight=" + weight + "]"; } @Override public int compareTo(Object o) { //自己实现Comparable接口的compareTo()方法 if(o instanceof Dog){ Dog d = (Dog)o; if(this.getHeight()>d.getHeight()) return 1; else if(this.getHeight()<d.getHeight()) return -1; else return 0; }else{ return -100; } } }
Comparator的具体实现类CatWeightComparator:
package com.luna.model.strategy; public class CatWeightComparator implements Comparator{ @Override public int compare(Object o1, Object o2) { Cat c1 = (Cat)o1; Cat c2 = (Cat)o2; if(c1.getWeight()>c2.getWeight()) return -1; else if(c1.getWeight()<c2.getWeight()) return 1; return 0; } }
对象排序工具类DataSorter:
package com.luna.model.strategy; public class DataSorter { public static void sort(Object[] o){ /** * 冒泡排序:从后往前排序 */ for (int i = o.length; i>0; i--) { for (int j = 0; j < i-1; j++) { Comparable o1 = (Comparable)o[j]; Comparable o2 = (Comparable)o[j+1]; if(o1.compareTo(o2)==1){ swap(o, j, j+1); } } } /** * 冒泡排序:从前往后排序 */ for (int i = 0; i < o.length - 1; i++) { for (int j = 0; j < o.length - 1 - i; j++) { Comparable o1 = (Comparable)o[j]; Comparable o2 = (Comparable)o[j+1]; if(o1.compareTo(o2)==1){ swap(o, j, j+1); } } } } private static void swap(Object[] a, int x, int y) { Object temp = a[x]; a[x] = a[y]; a[y] = temp; } public static void sort(Cat[] a){ for (int i = a.length; i>0; i--) { for (int j = 0; j < i-1; j++) { if(a[j].getHeight()>a[j+1].getHeight()){ swap(a,j,j+1); } } } } private static void swap(Cat[] a, int x, int y) { Cat temp = a[x]; a[x] = a[y]; a[y] = temp; } /** * 冒泡排序算法 * @param a */ public static void sort(int[] a){ for (int i = a.length; i>0; i--) { for (int j = 0; j < i-1; j++) { if(a[j]>a[j+1]){ swap(a,j,j+1); } } } } private static void swap(int[] a, int x, int y) { int temp = a[x]; a[x] = a[y]; a[y] = temp; } public static void print(int[] a){ for (int i = 0; i < a.length; i++) { System.out.print(a[i]+" "); } System.out.println(); } public static void print(Cat[] c) { for (int i = 0; i < c.length; i++) { System.out.print(c[i]+""); } System.out.println(); } public static void print(Object[] c) { for (int i = 0; i < c.length; i++) { System.out.print(c[i]+""); } System.out.println(); } }
排序测试类Test:
package com.luna.model.strategy; public class Test { public static void main(String[] args) { int a[] = {9,5,3,7,1}; DataSorter.sort(a); DataSorter.print(a); Cat c[] = {new Cat("Red",5,5),new Cat("blue",3,3), new Cat("pink",1,1)}; DataSorter.sort(c); DataSorter.print(c); } }