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方法,程式碼如下
Console 輸出:[姓名=aa, 學號=1, 姓名=cc, 學號=2, 姓名=bb, 學號=3]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; } }
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,當集合不支援自身比較器或者不滿足程式設計師需求時
相關推薦
【轉載】Java中Comparable和Comparator比較
import 比較器 todo itl 復制代碼 ack div array open 【本文轉自】http://www.cnblogs.com/skywang12345/p/3324788.html Comparable 簡介 Comparable 是排序接口。 若一
Java中Comparable和Comparator比較
collect clas bold 數據 let 排序類 height webkit tom 1、Comparable 介紹 Comparable 是一個排序接口,如果一個類實現了該接口,說明該類本身是可以進行排序的。註意,除了基本數據類型(八大基本數據類型) 的數組或
java中Comparable和Comparator介紹
Comparable和Comparator介面都是為了對類進行比較,眾所周知,諸如Integer,double等基本資料型別,java可以對他們進行比較,而對於類的比較,需要人工定義比較用到的欄位比較邏輯。 一、Comparable簡介 Comparable是排序介面。若一個類實現了Co
Java中Comparable和Comparator區別小結
回到頂部一、Comparable簡介 Comparable是排序介面。若一個類實現了Comparable介面,就意味著該類支援排序。實現了Comparable介面的類的物件的列表或陣列可以通過Collections.sort或Arrays.sort進行自動排序。 此外,實現此介面的物件可以用作有序對映
Java中Comparable和Comparator詳解
該文基於JDK1.8。 一、Comparable<T> Comparable<T>原始碼如下: package java.lang; import java.util.*; /** * This interface imposes a total orde
Java中Comparable和Comparator的使用
Comparable 外部比較器 在java.lang包內 自然排序以學生類為例,包含屬性,構造方法,hashcode,equals方法等public class Student { public String name; public int id; publi
Java中Comparable和Comparator介面區別分析
Comparable 簡介 Comparable 是排序介面。 若一個類實現了Comparable介面,就意味著“該類支援排序”。 即然實現Comparable介面的類支援排序,假設現在存在“實現Comparable介面的類的物件的List列表(或陣列)”,則該List
【Java】Comparable和Comparator接口的區別
包含 第一個 入參 pareto blog 等於 compare 排序。 tor Java提供了只包含一個compareTo()方法的Comparable接口。這個方法可以個給兩個對象排序。具體來說,它返回負數,0,正數來表明已經存在的對象小於,等於,大於輸入對象。
JAVA中Arrays.sort()使用兩種方式(Comparable和Comparator介面)對物件或者引用進行排序
package com.dt.Sort; import java.util.Arrays; import java.util.Comparator; /** * 使用Comparator介面:編寫多個排序方式類實現Comparator介面,並重寫新Comparator介面中的compare()方法 pub
Java 中Collection和Collections 、Comparable 和Comparator的區別
Collection是一個介面,Set和List集合的父類 Collections是一個類,主要用於對集合的排序,sort方法 Comparator 和 Comparable 相同的地方 他們都是java的一個介面, 並且是用來對自定義的class比較大小
Java Comparable和Comparator
排序 hide fun app private args tostring div oid Java中在進行數據排序時,Comparable和Comparator不可缺少會遇得到。普通的String、Integer等類型,已經實現了Comparable接
Comparable和Comparator的區別 :Java 類的比較
size 兩種 邏輯 簡單 用戶 代碼 比較 nts 定義 Comparable: 用於類內部的比較, ex: public class Persion implements Comparable {..比較Person的大小..},person現在是可以比較大小的
Java排序方法--List,數組,【自定義】繼承Comparable和Comparator
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):Comparable和Comparator的區別
在將Comparable和Comparator區別之前,先補充一個知識點。 先看程式碼: public class Person<T> { private T id; public T getId() { retur
Java - comparable和comparator的區別和用法
最近遇到一個問題、需要對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,陣列排序。【自定義】繼承Comparable和Comparator
(一)list和陣列①List預設排序程式碼:public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("阿a裡 "
Java基礎系列-Comparable和Comparator
todo har ren check 怪異 def 額外 integer 反序 原創文章,轉載請標註出處:[《Java基礎系列-Comparable和Comparator》](https://www.jianshu.com/p/f9870fd05958## 一、概述