Java 比較器的用法

来源:https://www.cnblogs.com/ELAIRS/archive/2019/10/03/11621106.html
-Advertisement-
Play Games

第一次寫博客,正好在回顧Java的時候用到了比較器,記錄一下使用的方法。 Java比較器多用於對象數組的排序,主要用到comparable和comparator介面 1、使用comparable介面 首先將需要實現排序對象的類實現comparable介面,實現後覆寫comparaTo(T other ...


  第一次寫博客,正好在回顧Java的時候用到了比較器,記錄一下使用的方法。

  Java比較器多用於對象數組的排序,主要用到comparable和comparator介面

 

  1、使用comparable介面

  首先將需要實現排序對象的類實現comparable介面,實現後覆寫comparaTo(T other)方法,在comparaTo方法中寫出比較規則,最後調用java.utils.Arrays.sort()方法傳入需要比較的對象數組即可排序。

  測試如下:

 1 import java.util.Arrays;
 2 
 3 public class Main {
 4 
 5     public static void main(String[] args) {
 6 
 7         Student[] arr = new Student[3];
 8         arr[0] = new Student(3);
 9         arr[1] = new Student(2);
10         arr[2] = new Student(1);
11         for( Student a : arr )
12             System.out.print(a+" ");
13         Arrays.sort(arr);
14         System.out.println();
15         for( Student a : arr )
16             System.out.print(a+" ");
17     }
18 }
19 
20 class Student implements Comparable<Student>{
21 
22     int number;
23 
24     public Student(int aNumber){
25         this.number = aNumber;
26     }
27 
28     public int compareTo(Student o){//對象自身與o比較,返回1的話,被比較的對象將會排在前面。
29         if(this.number > o.number){
30             return 1;
31         }else if(this.number == o.number){
32             return 0;
33         }else
34             return -1;
35     }
36 
37     public String toString(){
38         return String.valueOf(number);
39     }
40 
41 }

運行結果為:

  3 2 1

  1 2 3

 

  註:

    比較時,若想要從大到小排序,將排序方式中的1更換成-1,-1更換成1即可。

=======================================

  2、使用comparator介面 

  有時,在設計Student類時沒有考慮到實現Comparable介面,可自己編寫一個比較器類.

  創建一個比較器類,實現comparator<T>介面,覆寫compare(T o1,T o2)方法,最後在調用Arrays.sort()時傳入要排序的數組和比較器類即可

  測試如下:

 1 package practice;
 2 import java.util.Arrays;
 3 import java.util.Comparator;
 4 
 5 public class Main {
 6 
 7     public static void main(String[] args) {
 8 
 9         Student[] arr = new Student[3];
10         arr[0] = new Student(1,3);
11         arr[1] = new Student(3,5);
12         arr[2] = new Student(2,5);
13         for( Student a : arr )
14             System.out.print(a+"\t");
15         Arrays.sort(arr,new StudentComparator()); //傳入數組和比較器類
16         System.out.println();
17         for( Student a : arr )
18             System.out.print(a+"\t");
19     }
20 }
21 
22 class Student{
23 
24     int number; //學號
25     int score; //分數
26 
27     public Student(int aNumber,int aScore){
28         this.number = aNumber;
29         this.score = aScore;
30     }
31 
32     public String toString(){
33         return number+"號分數:"+score;
34     }
35 
36 }
37 
38 class StudentComparator implements Comparator<Student>{
39 
40     public int compare(Student o1, Student o2) { //在編寫時添加了新比較規則,分數高的在前,若分數相同,學號大的在前。
41         if(o1.score > o2.score)
42             return -1;
43         else if(o1.score < o2.score)
44             return 1;
45         else{
46             if(o1.number > o2.number)
47                 return -1;
48             else if(o1.number < o2.number)
49                 return 1;
50             else
51                 return 0;
52         }
53     }
54 
55 }

  運行結果:

  1號分數:3  3號分數:5  2號分數:5
  3號分數:5  2號分數:5  1號分數:3

 上面的方法也可以像本次測試一樣,修改比較規則,實現不同排序效果。

=======================================

   如果想為集合類排序,與第二種方法類似,在調用Collections.sort(st,new ComparatorSort())時傳入集合和比較器即可。

 


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

-Advertisement-
Play Games
更多相關文章
  • 下麵的代碼是基於開源項目 "SystemBarTint" ,我們需要添加其依賴 下麵的代碼,我在類原生的Android7.0系統測試通過,其他的國產ROM系統未進行測試 設置狀態欄白色 1. 設置主題theme 在AndroidManifest文件中,設置theme 按住Ctrl,點開那個theme ...
  • "微信小程式開發環境安裝以及相關設置配置" "微信小程式前端頁面書寫" "微信小程式前端樣式WXSS書寫" "微信小程式中事件" "微信小程式自定義組件" "微信小程式發起請求" "微信小程式登入流程" "微信小程式路由跳轉" "微信小程式與用戶交互" "異常:微信小程式tabBar不生效" ...
  • 一、文本單行顯示溢出時出現省略號 二、文本多行顯示溢出時出現省略號(這種樣式只能在webkit和移動端使用,包括小程式,不能設置固定高度) 三、首行縮進兩字元 ...
  • 方法一、兩個div都設置 display: table-cell; 方法二、父級div設置 display: -webkit-box; ...
  • 熱愛旅行,一直想找到一個應用記錄我到過的新的“領土”。搜了下市面上已經存在的地圖應用,都不是我想要的。找不到趁手的工具,那就自己打造一把。如何打造一個自己的旅行足跡地圖? ...
  • 命令模式(Command): 將請求封裝成對象,以便使用不同的請求、日誌、隊列等來參數化其他對象。命令模式也支持撤銷操作。 命令模式的角色: 1)傳遞命令對象(Invoker):是請求的發送者,它通常擁有很多的命令對象,並通過訪問命令對象來執行相關請求,它不直接訪問接收者。 2)抽象命令介面(Com ...
  • 使用Python內置函數:bin()、oct()、int()、hex()可實現進位轉換。 先看Python官方文檔中對這幾個內置函數的描述: bin(x)Convert an integer number to a binary string. The result is a valid Pytho ...
  • "Flask的使用以及返回值(其中Response後續詳細單獨補充)" "Flask的路由解讀以及其配置" "Flask的請求擴展" "Flask中的cookie和session" "Flask中的request和response" "Flask中的渲染變數" "Flask中的CBV以及正則表達式" ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...