1. 程式人生 > >Comparable介面和Comparator介面的比較

Comparable介面和Comparator介面的比較

概述

        在實際應用中,我們往往有需要比較兩個自定義物件大小的地方。而這些自定義物件的比較,就不像簡單的整型資料那麼簡單,它們往往包含有許多的屬性,我們一般都是根據這些屬性對自定義物件進行比較的。所以Java中要比較物件的大小或者要對物件的集合進行排序,需要通過比較這些物件的某些屬性的大小來確定它們之間的大小關係。

        一般,Java中通過介面實現兩個物件的比較,比較常用就是Comparable介面和Comparator介面。首先類要實現介面,並且使用泛型規定要進行比較的物件所屬的類,然後類實現了介面後,還需要實現介面定義的比較方法(compareTo方法或者compare方法),在這些方法中傳入需要比較大小的另一個物件,通過選定的成員變數與之比較,如果大於則返回1,小於返回-1,相等返回0。

        1、Comparable和Comparator都是用來實現集合中元素的比較、排序的。

        2、Comparable是在類內部定義的方法實現的排序,位於java.lang下。

        3、Comparator是在類外部實現的排序,位於java.util下。

        4、實現Comparable介面需要覆蓋compareTo方法,實現Comparator介面需要覆蓋compare方法。

Comparable介面

        1、什麼是Comparable介面

        此介面強行對實現它的每個類的物件進行整體排序。此排序被稱為該類的自然排序,類的 compareTo方法被稱為它的自然比較方法 。實現此介面的物件列表(和陣列)可以通過 Collections.sort(和 Arrays.sort )進行自動排序。實現此介面的物件可以用作有序對映表中的鍵或有序集合中的元素,無需指定比較器。

        如String、Integer自己就實現了Comparable介面,可完成比較大小操作。自定義類要在加入list容器中後能夠排序,也可以實現Comparable介面,在用Collections類的sort方法排序時若不指定Comparator,那就以自然順序排序。所謂自然順序就是實現Comparable介面設定的排序方式。

        2、實現什麼方法

        int compareTo(T o)

        比較此物件與指定物件的順序。如果該物件小於、等於或大於指定物件,則分別返回負整數、零或正整數。

        引數:o - 要比較的物件。

        返回:負整數、零或正整數,根據此物件是小於、等於還是大於指定物件。

        丟擲:ClassCastException - 如果指定物件的型別不允許它與此物件進行比較。

程式例項

/**
 * 
 * @Description: 自定義類實現Comparable介面實現比較大小
 *
 * @author: zxt
 *
 * @time: 2018年5月15日 上午9:18:42
 *
 */
public class Person implements Comparable<Person> {
	private String name;
	private int age;

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	/**
	 * 實現Comparable介面,在類的內部實現比較邏輯,通過覆蓋compareTo方法,如此一來,自定義的兩個類可以比較大小
	 * 將自定義的類放在集合類中,可以使用Collections的sort來自然排序,不用提供比較器。自然排序的實現即compareTo方法
	 */
	@Override
	public int compareTo(Person anotherPerson) {
		// 先比較name的大小,若一樣再比較age的大小
		
		// 使用字串的比較
		int flag = name.compareTo(anotherPerson.getName());
		if(flag == 0) {
			// 名字相等,則比較年齡
			return age - anotherPerson.getAge();
			
		} else {
			// 名字不一樣,返回名字比較結果
			return flag;
		}
	}
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	public String toString() {
		return "[ name:" + name + ", age:" + age + " ]";
	}
}

public class ComparableTest {
	public static void main(String[] args) {
		List<Person> list = new ArrayList<Person>();
		list.add(new Person("zhangsan", 45));
		list.add(new Person("lisi", 34));
		list.add(new Person("alilang", 11));
		list.add(new Person("woshishui", 45));
		list.add(new Person("zhangsan", 12));
		list.add(new Person("lisi", 50));
		list.add(new Person("wangwu", 23));
		
		System.out.println("初始列表:");
		for(Person person : list) {
			System.out.print(person + "\t");
		}
		System.out.println();
		
		System.out.println("排序後:");
		Collections.sort(list);
		for(Person person : list) {
			System.out.print(person + "\t");
		}
	}
}

Comparator介面

        Comparator是一個專用的比較器,當這個物件不支援自比較或者自比較函式不能滿足要求時,可寫一個比較器來完成兩個物件之間大小的比較。Comparator體現了一種策略模式(strategy design pattern),就是不改變物件自身,而用一個策略物件(strategy object)來改變它的行為。

        與上面的Comparable介面不同的是:

        1)、Comparator位於包java.util下,而Comparable位於包java.lang下。

        2)、Comparable介面將比較程式碼嵌入需要進行比較的類的自身程式碼中,而Comparator介面在一個獨立的類中實現比較。

        3)、如果前期類的設計沒有考慮到類的Compare問題而沒有實現Comparable介面,後期可以通過Comparator介面來實現比較演算法進行排序,並且為了使用不同的排序標準做準備,比如:升序、降序。

        4)、Comparable介面強制進行自然排序,而Comparator介面不強制進行自然排序,可以指定排序順序。

程式例項

/**
 * 
 * @Description: 自定義類實現實現比較大小,使用Comparator介面可以不修改原始碼
 *
 * @author: zxt
 *
 * @time: 2018年5月15日 上午9:18:42
 *
 */
public class Cat{
	private String name;
	private int age;

	public Cat(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	public String toString() {
		return "[ name:" + name + ", age:" + age + " ]";
	}
}

import java.util.Comparator;

/**
 * 
 * @Description: 實現Comparator介面,實現一個比較器
 *
 * @author: zxt
 *
 * @time: 2018年5月15日 上午9:49:45
 *
 */
public class CatComparator implements Comparator<Cat> {

	/**
	 * 實現Comparator介面,在類的外部實現比較邏輯,通過覆蓋compare方法,
	 * 將自定義的類放在集合類中,使用Collections的sort來排序時,需要提供集合類本身,以及該比較器。
	 */
	@Override
	public int compare(Cat cat1, Cat cat2) {
		// 先比較name的大小,若一樣再比較age的大小
		
		// 使用字串的比較
		int flag = cat1.getName().compareTo(cat2.getName());
		if(flag == 0) {
			// 名字相等,則比較年齡
			return cat1.getAge() - cat2.getAge();
			
		} else {
			// 名字不一樣,返回名字比較結果
			return flag;
		}
	}

}

public class ComparatorTest {

	public static void main(String[] args) {
		List<Cat> list = new ArrayList<Cat>();
		list.add(new Cat("xiaohong", 12));
		list.add(new Cat("xiaohua", 32));
		list.add(new Cat("dahua", 33));
		list.add(new Cat("dahuang", 45));
		list.add(new Cat("dahua", 7));
		list.add(new Cat("xiaohong", 45));
		list.add(new Cat("xiaohei", 22));
		
		
		System.out.println("初始列表:");
		for(Cat cat : list) {
			System.out.print(cat + "\t");
		}
		System.out.println();
		
		System.out.println("排序後:");
		Collections.sort(list, new CatComparator());
		for(Cat cat : list) {
			System.out.print(cat + "\t");
		}
	}
}

總結

        兩種方法各有優劣,用Comparable 簡單,只要實現Comparable介面的物件直接就成為一個可以比較的物件,但是需要修改原始碼;用Comparator 的好處是不需要修改原始碼,而是另外實現一個比較器,當某個自定義的物件需要作比較的時候,把比較器和物件一起傳遞過去就可以比大小了。並且在Comparator裡面使用者可以自己實現複雜的可以通用的邏輯,使其可以匹配一些比較簡單的物件,那樣就可以節省很多重複勞動了。總而言之Comparable是自已完成比較,Comparator是外部程式實現比較。

相關推薦

Comparable介面Comparator介面比較

概述        在實際應用中,我們往往有需要比較兩個自定義物件大小的地方。而這些自定義物件的比較,就不像簡單的整型資料那麼簡單,它們往往包含有許多的屬性,我們一般都是根據這些屬性對自定義物件進行比較的。所以Java中要比較物件的大小或者要對物件的集合進行排序,需要通過比較

Java中實現物件的比較Comparable介面Comparator介面

在實際應用中,我們往往有需要比較兩個自定義物件大小的地方。而這些自定義物件的比較,就不像簡單的整型資料那麼簡單,它們往往包含有許多的屬性,我們一般都是根據這些屬性對自定義物件進行比較的。所以Java中要比較物件的大小或者要對物件的集合進行排序,需要通過比較這些物件的某些屬性

集合框架(五)使用Comparable介面Comparator介面比較元素

1、有時希望將元素插入到一個樹集合中個,這些元素可能不是java.lang.Comparable的例項,這時可以定義一個比較器來比較這些元素。即需要建立一個實現java.util.Comparator介面的類。Comparator介面有兩個方法:compare和

Java中實現Comparable介面Comparator介面的排序演算法效率比較

在PAT Basic Level的真題中,有”德才論“這麼一題(點選可開啟題目)。 最開始我是構造了一個學生類,存放學生資訊,實現Comparator介面,遺憾的是,後臺測試時,每一個測試用例皆顯示程式執行超時。 public class Main ... class S

Java中的Comparable介面Comparator介面

介紹Comparable<T>介面和Comparator<T>介面都是JDK中提供的和比較相關的介面。使用它們可以對物件進行比較大小,排序等操作。這算是之後排序的先導知識吧。Comparable, 字面意思是“可以比較的”,所以實現它的類的多個例項應該可以相互比較“大小”或者

Comparable介面Comparator介面的區別(通俗版)

概述 Comparable和Comparator都是用來實現集合中元素的比較、排序的。 Comparable是在集合內部定義的方法實現的排序,位於java.lang下。 Comparator是在集合外部實現的排序,位於java.util下。 Comparable是一個物件本

【java】實現Comparable介面Comparator介面,並重寫compareTo方法compare方法

實現Comparable介面和Comparator介面,並重寫compareTo方法和compare方法 2016年08月11日 14:39:25 蘇尹 閱讀數:10772更多 個人分類: 學習筆記 實體類:java.lang.Comparable(介面) + coma

實現Comparable介面Comparator介面,並重寫compareTo方法compare方法

實體類:java.lang.Comparable(介面) + comareTo(重寫方法),業務排序類 java.util.Comparator(介面) + compare(重寫方法). 這兩個介面我們非常的熟悉,但是 在用的時候會有一些不知道怎麼下手的感覺,現在用案例

Comparable介面Comparator介面的使用

1、Comparable介面生命了一個比較兩個物件大小的comparaTo()方法。 例如: public class Edge implements Comparable<Edge>{public  int a;public  int b;public int

):Comparable介面Comparator介面

目錄 1 介紹 2 Comparable介面 3 Comparator介面 4 總結 1 介紹       有這樣2個人,一個人光頭,一個人有黑色頭髮,現在不允許染髮,只允許光頭的帶假髮,理由是有頭髮的人沒有必要再帶假髮,那麼誰可以有多種顏色的頭髮?在這種情況下,有頭髮的人,因為他的頭髮和自身繫結在一起,

ComparableComparator介面比較

Java提供了只包含一個compareTo()方法的Comparable介面。這個方法可以個給兩個物件排序。具體來說,它返回負數,0,正數來表明已經存在的物件小於,等於,大於輸入物件。 Java提供了包含compare()和equals()兩個方法的Comparator介面。compare()方

Comparable Comparator 介面比較

背景 Comparable equals compareTo Comparator

Java Comparable排序介面Comparator比較介面

       實現Comparable介面的類支援排序,假設現在存在“實現Comparable介面的類的物件的List列表(或陣列)”,則該List列表(或陣列)可以通過 Collections.so

Java中類的比較與排序方法(應用Comparable介面Comparator介面)

引言 在平時寫Java的程式的時候,如果要進行一些基本型別的變數的比較,可以很方便得呼叫’Math.max()’、Math.min()等方法,如果要對陣列或者列表進行排序,也可以用Arrays.sort()和Collections.sort()等已經封裝好的方法來進行。但是,如果是一個自

Comparable Comparator介面

Comparable 是提供一定排序的介面,而Comparator介面通過我們的自定義來比較。 所以Comparable希望提供自然順序的類,介面中的一個方法 int compareTo(object o)比較當前物件,在物件之後返回正值; 而Comparato

JAVA中Arrays.sort()使用兩種方式(ComparableComparator介面)對物件或者引用進行排序

package com.dt.Sort; import java.util.Arrays; import java.util.Comparator; /**  * 使用Comparator介面:編寫多個排序方式類實現Comparator介面,並重寫新Comparator介面中的compare()方法 pub

Java中ComparableComparator介面區別分析

Comparable 簡介 Comparable 是排序介面。 若一個類實現了Comparable介面,就意味著“該類支援排序”。  即然實現Comparable介面的類支援排序,假設現在存在“實現Comparable介面的類的物件的List列表(或陣列)”,則該List

ComparableComparator介面是幹什麼的?列出它們的區別

Java提供了只包含一個compareTo()方法的Comparable介面。這個方法可以個給兩個物件排序。具體來說,它返回負數,

Java Comparable Comparator 介面詳解

> 本文基於 JDK8 分析 ## Comparable Comparable 介面位於 java.lang 包下,Comparable 介面下有一個 compareTo 方法,稱為自然比較方法。一個類只要實現了這個介面,意味著該類支援自然排序 所謂自然排序,就是按預設規則組成的排序,例如 12

Java的Comparable內部比較Comparator外部比較

正整數 seq pareto private 實現 結果 pack 單獨 post //這裏簡單介紹一下Java的Comparable內部比較器和Comparator外部比較器的用法實現 //那麽我們來做一個關於對象間的排序,首先建一個Model或者叫JavaBen。如下: