1. 程式人生 > >Java中Comparable和Comparator的使用

Java中Comparable和Comparator的使用

Comparable 外部比較器  在java.lang包內  自然排序

以學生類為例,包含屬性,構造方法,hashcode,equals方法等

public class Student {
	public String name;
	public int id;

	public Student(String name, int id) {
		super();
		this.name = name;
		this.id = id;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + id;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (id != other.id)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "姓名=" + name + ", 學號=" + id;
	}
}
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
import org.junit.Test;

public class TestStudent{

	@Test
	public void testComparable() {
		Set<Student> s1 = new TreeSet<>();
		s1.add(new Student("bb", 3));
		s1.add(new Student("bb", 3));
		s1.add(new Student("cc", 2));
		s1.add(new Student("aa", 1));
		System.out.println(s1);
	}
}

會有java.lang.ClassCastException: org.witer.Student cannot be cast to java.lang.Comparable異常;意思是學生型別轉換為Comparable型別失敗

讓學生類實現Comparable介面,重寫compareTo方法,程式碼如下

import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
import org.junit.Test;

public class Student implements Comparable<Student> {
	public String name;
	public int id;

	public Student(String name, int id) {
		super();
		this.name = name;
		this.id = id;
	}

	// 計算hash值是否相等
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + id;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	// 若hash值相等,用equals判斷是否相等
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (id != other.id)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "姓名=" + name + ", 學號=" + id;
	}

	// 改寫compareTo方法
	@Override
	public int compareTo(Student o) {
		// 定義一個變數bj 將傳入的引數和自己比較
		int bj = this.id > o.id ? 1 : (this.id == o.id ? 0 : -1);
		// 若id值相同,則用姓名的自然排序
		if (bj == 0) {
			bj = this.name.compareTo(o.name);
		}
		return bj;
	}
}
Console  輸出:[姓名=aa, 學號=1, 姓名=cc, 學號=2, 姓名=bb, 學號=3]

Comparator 內部比較器  在java.util包內   定製排序

以人類為例,參照學生類,也可以實現Comparator介面,重寫compare方法,但是這樣浪費了資源(一個類)

所以可以在外部寫一個比較器,呼叫比較器解決問題

public class Person {
	private String name;
	private int 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 Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "姓名=" + name + ", 年齡=" + age;
	}
}
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
import org.junit.Test;

public class TestStudent{
	
	@Test
	public void testComparator(){
		//定義一個比較器
		Comparator<Person> com=new Comparator<Person>() {
			@Override
			//重寫compare方法
			public int compare(Person o1, Person o2) {
				//定義一個變數接收比較值
			int b=o1.getAge()>o2.getAge()?1:(o1.getAge()==o2.getAge()?0:-1);
				//如果年齡相等,按姓名的自然排序
				if(b==0){
					b=o1.getName().compareTo(o2.getName());
				}
				return b;
			}
		};
		//建立集合並呼叫比較器
		Set<Person>p1=new TreeSet<>(com);
		p1.add(new Person("cc", 15));
		p1.add(new Person("aa", 28));
		p1.add(new Person("aa", 12));
		p1.add(new Person("bb", 15));
		System.out.println(p1);
		
	}
}

Console顯示   [姓名=aa, 年齡=12, 姓名=bb, 年齡=15, 姓名=cc, 年齡=15, 姓名=aa, 年齡=28]

什麼時候使用定製排序?

答:1,當自然排序和定製排序都存在時,優先使用定製排序

       2,當集合不支援自身比較器或者不滿足程式設計師需求時

相關推薦

【轉載】JavaComparableComparator比較

import 比較器 todo itl 復制代碼 ack div array open 【本文轉自】http://www.cnblogs.com/skywang12345/p/3324788.html Comparable 簡介 Comparable 是排序接口。 若一

JavaComparableComparator比較

collect clas bold 數據 let 排序類 height webkit tom 1、Comparable 介紹 Comparable 是一個排序接口,如果一個類實現了該接口,說明該類本身是可以進行排序的。註意,除了基本數據類型(八大基本數據類型) 的數組或

javaComparableComparator介紹

Comparable和Comparator介面都是為了對類進行比較,眾所周知,諸如Integer,double等基本資料型別,java可以對他們進行比較,而對於類的比較,需要人工定義比較用到的欄位比較邏輯。 一、Comparable簡介   Comparable是排序介面。若一個類實現了Co

JavaComparableComparator區別小結

回到頂部一、Comparable簡介   Comparable是排序介面。若一個類實現了Comparable介面,就意味著該類支援排序。實現了Comparable介面的類的物件的列表或陣列可以通過Collections.sort或Arrays.sort進行自動排序。   此外,實現此介面的物件可以用作有序對映

JavaComparableComparator詳解

該文基於JDK1.8。 一、Comparable<T> Comparable<T>原始碼如下: package java.lang; import java.util.*; /** * This interface imposes a total orde

JavaComparableComparator的使用

Comparable 外部比較器  在java.lang包內  自然排序以學生類為例,包含屬性,構造方法,hashcode,equals方法等public class Student { public String name; public int id; publi

JavaComparableComparator介面區別分析

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

JavaComparableComparator接口的區別

包含 第一個 入參 pareto blog 等於 compare 排序。 tor   Java提供了只包含一個compareTo()方法的Comparable接口。這個方法可以個給兩個對象排序。具體來說,它返回負數,0,正數來表明已經存在的對象小於,等於,大於輸入對象。  

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

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

Java CollectionCollections 、Comparable Comparator的區別

Collection是一個介面,Set和List集合的父類 Collections是一個類,主要用於對集合的排序,sort方法 Comparator 和 Comparable 相同的地方 他們都是java的一個介面, 並且是用來對自定義的class比較大小

Java ComparableComparator

排序 hide fun app private args tostring div oid Java中在進行數據排序時,Comparable和Comparator不可缺少會遇得到。普通的String、Integer等類型,已經實現了Comparable接

ComparableComparator的區別 :Java 類的比較

size 兩種 邏輯 簡單 用戶 代碼 比較 nts 定義 Comparable: 用於類內部的比較, ex: public class Persion implements Comparable {..比較Person的大小..},person現在是可以比較大小的

Java排序方法--List,數組,【自定義】繼承ComparableComparator

pri locale student ide abcdefg 接口 com main object (一)list和數組 ①List默認排序代碼: public static void main(String[] args) { List<String>

java Comparable Comparator接口區別

什麽 eset int origin image clas 新建 rate http Comparable 簡介 Comparable 是排序接口。 若一個類實現了Comparable接口,就意味著“該類支持排序”。 即然實現Comparable接口的類支持排序,假設現在

Java原始碼系列(1):ComparableComparator的區別

在將Comparable和Comparator區別之前,先補充一個知識點。 先看程式碼: public class Person<T> {   private T id;   public T getId() {     retur

Java - comparablecomparator的區別用法

最近遇到一個問題、需要對List中的物件進行排序。無腦寫程式碼的解決方案是:取出來排序。當然這不符合我們程式設計師的追求。 Java中有兩個介面專門用於排序、比較。它們就是comparable和comparator。也有人稱之為內部比較器和外部比較器。 內部比較器 comparable:它重

Java Comparable 介面的意義用法.

在之前的博文中已經介紹了Java中Collection 介面和 Collections類. http://blog.csdn.net/nvd11/article/details/21516075 一, 為何需要實現Comparable介面 我們知道Collection

java Comparable Comparator詳解及 區別(附程式碼)

java中,對集合物件或者陣列物件排序,有兩種實現方式。 即:(1)物件實現Comparable 介面         (2)定義比較器,實現Comparator介面。 下面會簡要介紹這兩種方法的區別,並附上實現程式碼,供大家參考。 Comparable介紹 Compar

Java實現排序的方法--List,陣列排序。【自定義】繼承ComparableComparator

(一)list和陣列①List預設排序程式碼:public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("阿a裡 "

Java基礎系列-ComparableComparator

todo har ren check 怪異 def 額外 integer 反序 原創文章,轉載請標註出處:[《Java基礎系列-Comparable和Comparator》](https://www.jianshu.com/p/f9870fd05958## 一、概述