Java中Compareable和Comparator兩種比較器的區別

Java中Compareable和Comparator兩種比較器的區別

 

參考原文連接:http://www.javashuo.com/article/p-htalmput-ec.html

 

1.引言

  在java這個到處是對象的世界裏,對兩個對象進行按某一屬性進行比較是特別常見的需求。好比書店中的書按照價格比較,亦或者是學生按照成績進行排名等等。html

對於JDK8而言,有三種實現對象比較的方法:java

一、在須要比較的對象類中覆寫Object類的equals()方法;數組

二、須要比較的類繼承Comparable接口,而後在其類內部實現compareTo()方法;ide

三、拋去須要被比較的類,在其外部自定義一個單獨的對象比較器,繼承自Comparator接口,實現compare()方法。post

因爲使用的排序方式的不一樣,具體選擇哪一種方法來實現對象的比較也會有所不一樣。this

第一種方法比較便於理解,複寫equals()方法通常用於本身實現的對象數組排序,已經在咱們上一篇文章 Java的equals方法的使用技巧 中進行了簡單介紹,須要瞭解的朋友能夠自行查看。本文咱們主要介紹內部比較器compareable和外部比較器comparator兩種。spa

2.內部比較器Compareable的用法

  這種方式就是讓本身編寫的類繼承Comparable接口,並實現接口的compareTo()方法,這種狀況下,在使用java.util.Arrays.sort()方法時不用指定具體的比較器。code

以書店的圖書爲例,具體實例代碼以下:htm

  1 import java.util.Arrays;
  2 
  3 class BookCook implements Comparable<BookCook>{
  4 	private String title;
  5 	private double price;
6 public BookCook(String title,double price){ 7 this.title = title; 8 this.price = price; 9 }
10 @Override 11 public String toString() { 12 return "書名:"+this.title+",價格:"+this.price; 13 }
14 @Override 15 public int compareTo(BookCook o) { 16 if(this.price > o.price){ 17 return 1; 18 }else if(this.price < o.price){ 19 return -1; 20 }else{ 21 return 0; 22 } 23 } 24 }

在寫代碼時要注意兩點:對象

(1)時刻要統一比較對象,在這裏就是BookCook

(2)在重寫的compareTo()方法中,須要特別注意的是,返回值的正負始終與this待比較對象保證同步,即當this值比指定對象大時,就返回正數1,小於時就返回負數-1,相等時就返回0.

3.外部比較器Comparator的用法

  從JDK1.8開始出現了Comparator接口,它的出現解決了當須要在已經開發好的代碼基礎上完善對象的比較功能時不想更改以前的代碼的問題。這種狀況下,咱們就須要單獨自定義一個對象比較器,繼承Comparator接口。當須要進行比較時,就new一個對象比較器。

以學生成績爲例,具體實現代碼以下:

  1 class Student {
  2 	private String name;
  3 	private double score;
  4 	public Student(String name,double score){
  5 		this.name = name;
  6 		this.score = score;
  7 	}
  8 	public double getScore(){
  9 		return this.score;
 10 	}
 11 	@Override
 12 	public String toString() {
 13 		return "姓名:"+this.name+",分數:"+this.score;
 14 	}
 15 
 16 }
    //自定義對象比較器 17 class StudentComparator implements Comparator<Student> { 18 @Override 19 public int compare(Student o1,Student o2) { 20 if(o1.getScore() > o2.getScore()){ 21 return 1; 22 }else if(o1.getScore() < o2.getScore()){ 23 return -1; 24 }else{ 25 return 0; 26 } 27 } 28 } 29 public class TestComparator { 30 31 public static void main(String[] args) { 32 33 Student[] sts = new Student[]{ 34 new Student("小戴",60), 35 new Student("小王",90), 36 new Student("老王",80), 37 new Student("小萱",95) 38 }; 39 //當須要比較功能時,須要在待比較對象後new一個自定義的比較器,以便其按照自定義比較器中的規則進行比較。 40 java.util.Arrays.sort(sts, new StudentComparator()); 41 System.out.println(java.util.Arrays.toString(sts)); 42 } 43 }
相關文章
相關標籤/搜索