當前位置:編程學習大全網 - 源碼下載 - java中Comparable和Comparator兩種比較器的區別

java中Comparable和Comparator兩種比較器的區別

Comparable和Comparator接口都是為了對類進行比較,眾所周知,諸如Integer,double等基本數據類型,java可以對他們進行比較,而對於類的比較,需要人工定義比較用到的字段比較邏輯。可以把Comparable理解為內部比較器,而Comparator是外部比較器,基本的寫法如下:

class Apple implements Comparable<Apple>{

int id;

double price;

public Apple(int id, double price) {

this.id = id;

this.price = price;

}

public int compareTo(Apple o) {

//return Double.compare(this.getPrice(),o.getPrice());

if (Math.abs(this.price-o.price)<0.001)

return 0;

else

return (o.price-this.price)>0?1:-1;

}

@Override

public String toString() {

return "Apple{" +

"id=" + id +

", price=" + price +

'}';

}

}

class AESComparator implements Comparator<Apple>{

public int compare(Apple o1, Apple o2) {

if (Math.abs(o1.price-o2.price)<0.001)

return 0;

else{

return (o1.price-o2.price)>0?1:-1;

}

}

}

實現了Comparable接口的類需要實現compareTo()方法,傳入壹個外部參數進行比對,實現了Comparator接口的方法需要實現compare()方法,對外部傳入的兩個類進行比較,從而讓外部方法在比較時調用。

兩者的區別是實現Comparator接口代碼更加靈活,可以定義某個類的多個比較器,從而在排序時根據實際場景自由調用,而Comparable接口實現後便不能改動。兩種接口的調用方式如下:

class AESComparator implements Comparator<Apple>{

public int compare(Apple o1, Apple o2) {

if (Math.abs(o1.price-o2.price)<0.001)

return 0;

else{

return (o1.price-o2.price)>0?1:-1;

}

}

}

class DESComparator implements Comparator<Apple>{

public int compare(Apple o1, Apple o2) {

if (Math.abs(o1.price-o2.price)<0.001)

return 0;

else {

return (o1.price-o2.price)>0?-1:1;

}

}

}

public static void main(String[] args) {

Apple apple1 = new Apple(1,4.8);

Apple apple2 = new Apple(2,5.9);

Apple apple3 = new Apple(3,8.5);

List<Apple> list = new ArrayList<Apple>();

list.add(apple1);

list.add(apple3);

list.add(apple2);

System.out.println("Comparable==========");

System.out.printf("this list of apples: %s\n",list);

Collections.sort(list);

System.out.printf("this list of apples: %s\n",list);

System.out.println("Comparator==========");

System.out.printf("this list of apples: %s\n",list);

Collections.sort(list,new DESComparator());

System.out.printf("this list of apples: %s\n",list);

Collections.sort(list,new AESComparator());

System.out.printf("this list of apples: %s\n",list);

}

}

上述代碼存在的問題,不能在比較器中進行double類型的減法操作,因為對於值比較大的double,減法操作容易導致值的溢出,java7對每壹種包裝類型的比較新增了compare()方法,改造後的代碼如下:

class Apple implements Comparable<Apple>{

int id;

double price;

public Apple(int id, double price) {

this.id = id;

this.price = price;

}

public int compareTo(Apple o) {

return Double.compare(this.price,o.price);

}

@Override

public String toString() {

return "Apple{" +

"id=" + id +

", price=" + price +

'}';

}

}

class AESComparator implements Comparator<Apple>{

public int compare(Apple o1, Apple o2) {

return Double.compare(o1.price,o2.price);

}

}

class DESComparator implements Comparator<Apple>{

public int compare(Apple o1, Apple o2) {

return Double.compare(o2.price,o1.price);

}

}

查看Double.compare的源碼如下

public static int compare(double d1, double d2) {

if (d1 < d2)

return -1; // Neither val is NaN, thisVal is smaller

if (d1 > d2)

return 1; // Neither val is NaN, thisVal is larger

// Cannot use doubleToRawLongBits because of possibility of NaNs.

long thisBits = Double.doubleToLongBits(d1);

long anotherBits = Double.doubleToLongBits(d2);

return (thisBits == anotherBits ? 0 : // Values are equal

(thisBits < anotherBits ? -1 : // (-0.0, 0.0) or (!NaN, NaN)

1)); // (0.0, -0.0) or (NaN, !NaN)

}

  • 上一篇:遊戲問道在打開的時候會自動彈出壹個網頁,如何阻止?
  • 下一篇:小程序適合什麽場景?
  • copyright 2024編程學習大全網