Comparable介面的實現和使用
1.什麼是Comparable介面
此介面強行對實現它的每個類的物件進行整體排序。此排序被稱為該類的自然排序 ,類的 compareTo 方法被稱為它的自然比較方法 。實現此介面的物件列表(和陣列)可以通過 Collections.sort (和 Arrays.sort )進行自動排序。實現此介面的物件可以用作有序對映表中的鍵或有序集合中的元素,無需指定比較器。 強烈推薦(雖然不是必需的)使自然排序與 equals 一致。所謂與equals一致是指對於類 C 的每一個 e1 和 e2 來說,當且僅當 (e1.compareTo((Object)e2) == 0) 與e1.equals((Object)e2) 具有相同的布林值時,類 C 的自然排序才叫做與 equals 一致 。
2.實現什麼方法
int compareTo(T o) 比較此物件與指定物件的順序。如果該物件小於、等於或大於指定物件,則分別返回負整數、零或正整數。
強烈推薦 (x.compareTo(y)==0) == (x.equals(y)) 這種做法,但不是 嚴格要求這樣做。一般來說,任何實現 Comparable 介面和違背此條件的類都應該清楚地指出這一事實。推薦如此闡述:“注意:此類具有與 equals 不一致的自然排序。”
引數: o - 要比較的物件。 返回:
負整數、零或正整數,根據此物件是小於、等於還是大於指定物件。 丟擲:
ClassCastException - 如果指定物件的型別不允許它與此物件進行比較。
3.例項
import java.util.*;
public class EmployeeSortTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Employee[] staff = new Employee[ 3 ];
staff[ 0 ] = new Employee( "harry Hacker" , 35000 );
staff[ 1 ] = new Employee( "carl cracke" , 75000 );
staff[ 2 ] = new Employee( "tony Tester" , 38000 );
Arrays.sort(staff); //sort方法可以實現對物件陣列排序,但是必須實現 Comparable介面
/*Comparable介面原型為:
* public interface Comparable<T>
* {
* int compareTo(T other);//介面的中方法自動屬於public方法
* }
*/
for (Employee e: staff)
System.out.println( "id=" +e.getId()+ " name=" +e.getName()+
".salary=" +e.getSalary());
}
}
/*
* 因為要實現對Employee物件的排序,所以在Employee類中要實現Comparable介面,
* 也就是要實現comepareTo()方法
*/
class Employee implements Comparable<Employee>
{
public Employee(String n, double s)
{
name = n;
salary = s;
Random ID = new Random();
id = ID.nextInt( 10000000 );
}
public int getId()
{
return id;
}
public String getName()
{
return name;
}
public double getSalary()
{
return salary;
}
public void raiseSalary( double byPercent)
{
double raise = salary *byPercent/ 100 ;
salary+=raise;
}
public int compareTo(Employee other)
{
if (id<other.id) //這裡比較的是什麼 sort方法實現的就是按照此比較的東西從小到大排列
return - 1 ;
if (id>other.id)
return 1 ;
return 0 ;
}
private int id;
private String name;
private double salary;
}
4.與Comparator的區別
Comparator位於包java.util下,而Comparable位於包java.lang下,Comparable介面將比較程式碼嵌入自身類中,而後者在一個獨立的類中實現比較。 如果類的設計師沒有考慮到Compare的問題而沒有實現Comparable介面,可以通過 Comparator來實現比較演算法進行排序,並且為了使用不同的排序標準做準備,比如:升序、降序。
我們看一個Comparator的例子:
import java.util.TreeSet;
import java.util.Comparator;
class NumComparator implements Comparator<NameTag> {
public int compare (NameTag left,NameTag right) {
return(left.getNumber() - right.getNumber());
}
}
public class CollectionNine {
public static void main(String arg[]) {
new CollectionNine();
}
CollectionNine() {
NumComparator comparator = new NumComparator();
TreeSet<NameTag> set = new TreeSet<NameTag>(comparator);
set.add(new NameTag("Agamemnon",300));
set.add(new NameTag("Cato",400));
set.add(new NameTag("Plato",100));
set.add(new NameTag("Zeno",200));
set.add(new NameTag("Archimedes",500));
for(NameTag tag : set)
System.out.println(tag);
}
}
相關文章
- 介面的定義和實現
- 通過Comparable來實現對自身的比較
- Comparable和Comparator的區別
- 比較器-Comparable和Comparator
- 從java內建類和自定義類比較Comparable介面和Comparator介面實現排序的不同Java排序
- Java Comparable 和 Comparator 介面詳解Java
- Java基礎系列-Comparable和ComparatorJava
- Java 中 Comparable 和 Comparator 比較Java
- OutputStreamWriter介紹&程式碼實現和InputStreamReader介紹&程式碼實現
- 簡單易懂的 Go 泛型使用和實現原理介紹Go泛型
- visual studio 使用技巧 1:快速找到介面的實現類
- Spartacus 註冊和登入頁面的實現細節
- mqtt介紹和go程式碼實現MQQTGo
- Laravel 中 Facade 門面的實現Laravel
- 閒說: Java 中Comparable 和 Comparator 的區別Java
- 給第三方使用介面的 URL 簽名實現
- 利用ServiceWorker實現頁面的快速載入和離線訪問
- React從零實現-介紹和準備React
- LCD1602和12864中8080和6800介面的區別
- SATA介面和M.2介面的固態硬碟哪個好?SSD硬碟SATA介面和M.2介面的區別硬碟
- JAVA中的Comparable介面和自定義比較器Java
- Go型別嵌入介紹和使用型別嵌入模擬實現“繼承”Go型別繼承
- 最全面的CQRS和事件溯源介紹 - Software House ASC事件
- ubuntu系統共享桌面的使用和配置Ubuntu
- java8介面的靜態方法和預設方法Java
- HTML 使用表單標籤實現註冊頁面的例項程式碼HTML
- Golang 限流器的使用和實現Golang
- Redis介紹和使用Redis
- The Graph介紹和使用
- 單目測距的基本介紹和實現原理
- mitmproxy 代理工具介紹:rewrite和map local實現MIT
- 使用C# (.NET Core) 實現觀察者模式 (Observer Pattern) 並介紹 delegate 和 eventC#模式Server
- 關於利用jQuery實現愛奇藝裡面的滑鼠移入改變當前頁面的功能的實現原理jQuery
- 關於期貨交易CTP介面的五檔行情接收,和設定實現
- Comparable與Comparator的區別
- mse~路由實現某個頁面的灰度功能路由
- postman實現介面的自動化測試Postman
- 最全面的改造Zuul閘道器為Spring Cloud Gateway(包含Zuul核心實現和Spring Cloud Gateway核心實現)ZuulSpringCloudGateway
- 實時微信域名檢測API介面的實現方式API