java容器---Comparable & Comparator

来源:https://www.cnblogs.com/zhuweiheng/archive/2018/01/04/8195920.html
-Advertisement-
Play Games

1.介面Comparable<T> API 此介面強行對實現它的每個類的對象進行整體排序。這種排序被稱為類的自然排序,類的compareTo()方法被稱為它的自然比較方法。 實現此介面的對象列表(和數組)可以通過 Collections.sort(和 Arrays.sort)進行自動排序。實現此介面 ...


1.介面Comparable<T> API

   參數類型:T ---可以與此對象進行比較的那些對象的類型

      此介面強行對實現它的每個類的對象進行整體排序。這種排序被稱為類的自然排序,類的compareTo()方法被稱為它的自然比較方法

      實現此介面的對象列表(和數組)可以通過 Collections.sort(和 Arrays.sort)進行自動排序。實現此介面的對象可以用作有序映射中的鍵或有序集合中的元素,無需指定比較器

     Comparable也只有int compareTo(T object)一個方法。比較此對象與指定對象的順序。如果該對象小於、等於或大於指定對象,則分別返回負整數、零或正整數。

  1 public class Person implements Comparable<Person>
  2 {
  3     String name;
  4     int age;
  5     public Person(String name, int age)
  6     {
  7         super();
  8         this.name = name;
  9         this.age = age;
 10     }
 11     public String getName()
 12     {
 13         return name;
 14     }
 15     public int getAge()
 16     {
 17         return age;
 18     }
 19     @Override
 20     public int compareTo(Person p)
 21     {
 22         return this.age-p.getAge();
 23     }
 24     public static void main(String[] args)
 25     {
 26         Person[] people=new Person[]{new Person("wangwu", 18),new Person("zhaoliu", 19)};
 27         System.out.println("排序前");
 28         for (Person person : people)
 29         {
 30             System.out.print(person.getName()+":"+person.getAge());
 31         }
 32         Arrays.sort(people); 
33
System.out.println("\n排序後");
 34         for (Person person : people)
 35         {
 36             System.out.print(person.getName()+":"+person.getAge());
 37         }
 38     }
 39 }

2.介面 Comparator<T> API

    強行對某個對象 collection 進行整體排序 的比較函數。可以將 Comparator 傳遞給 sort 方法(如 Collections.sortArrays.sort),從而允許在排序順序上實現精確控制。還可以使用 Comparator 來控制某些數據結構(如有序 set有序映射)的順序,或者為那些沒有自然順序的對象 collection 提供排序。

(1)int compare(T o1, T o2)

    比較用來排序的兩個參數。根據第一個參數小於、等於或大於第二個參數分別返回負整數、零或正整數。

    拋出異常:ClassCastException - 如果參數的類型不允許此 Comparator 對它們進行比較。

(2)boolean equals(Object obj)

    指示某個其他對象是否“等於”此 Comparator。此方法必須遵守 Object.equals(Object) 的常規協定。此外,僅當 指定的對象也是一個 Comparator,並且強行實施與此 Comparator 相同的排序時,此方法才返回 true。因此,comp1.equals(comp2) 意味著對於每個對象引用 o1o2 而言,都存在 sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))

   註意, 重寫 Object.equals(Object) 方法總是 安全的。然而,在某些情況下,重寫此方法可以允許程式確定兩個不同的 Comparator 是否強行實施了相同的排序,從而提高性能。

  若一個類要實現Comparator 介面:它一定要實現compare(T o1, T o2) 函數,但可以不實現 equals(Object obj) 函數。

  1 //定義一個比較器
  2 public class PersonCompartor implements Comparator<Person>
  3 {
  4     @Override
  5     public int compare(Person o1, Person o2)
  6     {
  7         return o1.getAge()-o2.getAge();
  8     }
  9 }
 10 
 11 public class Person
 12 {
 13     String name;
 14     int age;
 15     public Person(String name, int age)
 16     {
 17         super();
 18         this.name = name;
 19         this.age = age;
 20     }
 21     public String getName()
 22     {
 23         return name;
 24     }
 25     public int getAge()
 26     {
 27         return age;
 28     }
 29     public static void main(String[] args)
 30     {
 31         Person[] people=new Person[]{new Person("xujian", 20),new Person("xiewei", 10)};
 32         System.out.println("排序前");
 33         for (Person person : people)
 34         {
 35             System.out.print(person.getName()+":"+person.getAge());
 36         }
//創建比較器參數PersonCompartor
 37         Arrays.sort(people,new PersonCompartor()); 
38
System.out.println("\n排序後");
 39         for (Person person : people)
 40         {
 41             System.out.print(person.getName()+":"+person.getAge());
 42         }
 43     }
 44 }

 

3.Comparator與Comparable比較

(1)Comparable 介面強行對實現它的每個類的對象進行整體排序。這種排序被稱為類的自然排序.

    Comparable是 定義在 Person類的內部稱為“內部排序”,是一種簡單的方式,需要修改源代碼。

Arrays.sort(people);

(2)Comparator 是比較器,排序時,需要新建比較器對象,將比較器和對象一起傳遞過去就可以比大小,可稱為“外部排序”。

Comparator 是定義在Person的外部的, 此時我們的Person類的結構不需要有任何變化。並且在Comparator 裡面用戶可以自己實現複雜的可以通用的邏輯,使其可以匹配一些比較簡單的對象,那樣就可以節省很多重覆勞動了。

Arrays.sort(people,new PersonCompartor());

 

相關鏈接

Java中Comparable和Comparator區別小結


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文目錄:1.幾個基本的概念2.創建線程的兩種方法3.線程相關的常用方法4.多線程安全問題和線程同步 4.1 多線程安全問題 4.2 線程同步 4.3 同步代碼塊和同步函數的區別以及鎖是什麼 4.4 單例懶漢模式的多線程安全問題5.死鎖(DeadLock) 1.幾個基本的概念 本文涉及到的一些概念, ...
  • 第一步:我們先來安裝Python 下載地址是:https://www.python.org/downloads/ 第二步,添加運行環境 手動添加環境變數:滑鼠右鍵我的電腦 -> 屬性 -> 點擊高級系統設置 -> 點擊環境變數 -> 點擊PATH 第三步:我們安裝pip 下載地址是:https:// ...
  • C++11 引入了 auto 和 decltype 這兩個關鍵字實現了類型推導,讓編譯器來操心變數的類型。這使得 C++ 也具有了和其他現代編程語言一樣,某種意義上提供了無需操心變數類型的使用習慣。 一. auto C++11之前:如果一個變數沒有聲明為 register變數,將自動被視為一個 au... ...
  • 位運算針對的是二進位,所以需要將進行位運算的數現轉成在記憶體中二進位的表示形式 左移或右移 例如: 3 << 2 = 12 原理就是: 左移就是從左邊開始去掉幾位,就在最後面添加0,補成32位 右移同理,在前面補0還是1要看最高位(最左邊)是0還是1。 計算方法: 左移:往左移幾位就乘以2的幾次冪 ( ...
  • 單線程與隔離性 Redis是使用單線程的方式來執行事務的,事務以串列的方式運行,也就是說Redis中單個命令的執行和事務的執行都是線程安全的,不會相互影響,具有隔離性。 在多線程編程中,對於共用資源的訪問要十分的小心: 在不加鎖的情況下,num是不能保持為1的。 而在Redis中,併發執行單個命令具 ...
  • Python的 工具可以創建隔離的Python環境, 是`virtualenv`的進一步封裝工具,可以讓它更好用。 安裝 Linux 系統下: pip install virtualenvwrapper Windows 系統下: pip install virtualenvwrapper win 配 ...
  • 寫在前面的話 2017年對我來說真是多災多難的一年,在這過去的一年裡發生的種種不幸,促使我下定決心一切要重新開始。在去年的夏天從公司裸辭後,來到了一個陌生的城市開啟了新的求職歷程,萬萬沒想到的是,求職之路竟然如此艱難,以至於現在想起來還心有餘悸。新的一年,我希望自己能有一個全新的面貌,那麼就從堅持分 ...
  • UserAction類代碼: 調用UserService類中crud各種方法 UserService類代碼: 調用UserDao介面 介面實現類UserDaoImplements 運行Apach伺服器,地址欄輸入action 控制台結果 Spring Hibernate Struts2等的 xml配 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...