自定義排序注意點

這段 Java 代碼展示了兩種排序方式的用法,分別是:

  1. 對普通數組進行排序Integer[] nums
  2. 對對象數組進行排序Student[] students

我來一步步給你講清楚:


? 第1部分:普通數組降序排序

static Integer[] nums = {3, 1, 4, 1, 5, 9};
  • 這是一個整型對象數組(Integer[]),不是基礎類型 int[],因為 Arrays.sort 的自定義排序器只接受對象數組。
  • 接下來用一個 匿名內部類 實現 Comparator<Integer>
Arrays.sort(nums, new Comparator<Integer>() {@Overridepublic int compare(Integer a, Integer b) {return b - a; // 降序:大的在前}
});

?解釋:

  • Arrays.sort(數組, 比較器) 會按照你提供的規則來排。

  • compare(a, b) 返回:

    • 0 表示 a > ba 應該排在后面(升序)

    • <0 表示 a < ba 應該排在前面

  • 所以 return b - a 就是降序的排序。


? 第2部分:對象數組排序(Student[]

static class Student {String name;int score;Student(String name, int score) {this.name = name;this.score = score;}
}

?解釋:

定義了一個 Student 類,每個學生有兩個屬性:名字和成績。

然后我們有一個數組:

Student[] students = {new Student("Alice", 90),new Student("Bob", 85)
};

排序邏輯如下:

Arrays.sort(students, new Comparator<Student>() {@Overridepublic int compare(Student a, Student b) {if (a.score != b.score)return b.score - a.score; // 分數高的在前,降序return a.name.compareTo(b.name); // 分數相同按名字升序}
});

?解釋:

  • 如果兩個學生分數不相等,就按分數排,分數高的在前。
  • 如果分數一樣,就比較名字,按字母表順序排(升序)。

? 總結

你能學到的點:

內容解釋
Arrays.sort(數組, Comparator)對數組自定義排序
return a - b升序
return b - a降序
對象數組需要根據字段來自定義排序
compareTo()比較字符串大小的方法

如果你想打印排序后的結果,也可以加上:

System.out.println(Arrays.toString(nums)); // 打印排序后的數字數組for (Student s : students) {System.out.println(s.name + " " + s.score);
}

這個問題問得非常好!我們來詳細解釋一下 Java 中 Comparator 的排序規則,尤其是 compare(a, b) 這個函數的返回值含義


? 一、compare(a, b) 的返回值含義:

在 Java 的排序邏輯中(比如 Arrays.sort() 使用的 Comparator):

compare(a, b) 返回值意義
< 0表示 a < b,a排前面
= 0表示 a = b,位置不變
> 0表示 a > b,a排后面

? 二、奇偶相同,按數值升序 return a - b

比如 a = 3, b = 5:

return a - b = 3 - 5 = -2

因為是負數,表示 a < b,3 會排在 5 前面,這就實現了升序排序


? 三、奇偶不同,奇數 < 偶數:

? 如果 a 是奇數,b 是偶數:
  • 例如 a = 3, b = 4
  • a % 2 == 1 成立
  • return (a % 2 == 1) ? -1 : 1; → 返回 -1
  • 表示 a < b奇數排在前
? 如果 a 是偶數,b 是奇數:
  • 例如 a = 4, b = 3
  • a % 2 == 1 不成立
  • 返回 1,表示 a > b偶數排在后

? 四、這個排序實現的最終目標:

把數組中的奇數排在前面、偶數排在后面,且各自內部都是升序排列


? 補充一嘴:為什么用 a - b 可以比較大小?

a - b 本質上是:

  • 負值 → a 小于 b
  • 0 → 相等
  • 正值 → a 大于 b

這正好符合 compare(a, b) 函數需要的三種返回情況。


你現在遇到這個錯誤是因為你混用了兩種類型:


🚫 報錯解釋

  1. Arrays.sort(int[], Comparator):這是錯誤的,因為你傳入的是 int[]基本類型數組),但帶 Comparator 的排序方法 只能用于對象類型的數組,比如 Integer[]
  2. Arrays.sort(ArrayList<Integer>, Comparator):這是錯誤的,因為 Arrays.sort() 只接受數組(T[]),而 ArrayList 是一個集合,不是數組。

? 正確的寫法(取決于你用什么類型)

? 如果你用的是 數組
Integer[] arr = {3, 1, 4, 2}; // 注意:是 Integer[] 不是 int[]Arrays.sort(arr, new Comparator<Integer>() {@Overridepublic int compare(Integer a, Integer b) {// 偶數 > 奇數;相同奇偶性按升序if (a % 2 == b % 2) return a - b;return (a % 2 == 1) ? -1 : 1;}
});
System.out.println(Arrays.toString(arr)); // [1, 3, 2, 4]
? 如果你用的是 ArrayList
ArrayList<Integer> list = new ArrayList<>();
list.add(3);
list.add(1);
list.add(4);
list.add(2);Collections.sort(list, new Comparator<Integer>() {@Overridepublic int compare(Integer a, Integer b) {if (a % 2 == b % 2) return a - b;return (a % 2 == 1) ? -1 : 1;}
});
System.out.println(list); // [1, 3, 2, 4]

?關鍵點記住:

你用的是什么排序方法要求的類型
int[]Arrays.sort(arr)無法使用 Comparator
Integer[]Arrays.sort(arr, cmp)? 可以使用 Comparator
ArrayList<T>Collections.sort(list, cmp)? 正確

如果你告訴我你用的是哪種變量(int[]Integer[]ArrayList<Integer>),我可以直接幫你寫出完整的正確代碼。你現在代碼中變量是哪個?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/76376.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76376.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/76376.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第十四屆藍橋杯大賽軟件賽省賽C/C++ 大學 A 組真題

文章目錄 1 幸運數題目描述&#xff1a;答案&#xff1a;4430091 代碼&#xff1a; 2 有獎問答題目描述&#xff1a;重點&#xff1a;答案&#xff1a;8335366 代碼&#xff1a; 3 平方差題目描述&#xff1a;思路&#xff1a;數學找規律代碼&#xff1a; 4 更小的數題目描述&a…

C++ 入門四:類與對象 —— 面向對象編程的核心基石

一、類的定義 1. 類的基本形式 class 類名 { public: // 公有成員&#xff08;類內外均可訪問&#xff09;數據類型 數據成員; // 公有數據成員數據類型 成員函數(參數列表); // 公有成員函數聲明 protected: // 保護成員&#xff08;類內和派生類可訪問&…

嵌入式---電機分類

一、按電流類型分類&#xff08;最基礎分類&#xff09; 1. 直流電機&#xff08;DC Motor&#xff09; 工作原理&#xff1a;通過換向器&#xff08;有刷&#xff09;或電子換向&#xff08;無刷&#xff09;將直流電源轉換為交變磁場&#xff0c;驅動轉子旋轉。 核心特點&a…

【python】并行編程模塊:threading / mutliprocess / parallel / Celery

在并行編程中&#xff0c;Python 具有簡化實現的內置和外部模塊。 本書是基于Python3.X的。 Python的threading模塊 Python的threading模塊為模塊 _thread 提供了一個抽象層&#xff0c;它是一個較低級別的模塊。 它提供的功能可以幫助程序員完成基于線程開發并行系統的艱巨任…

OpengGL教程(七)---攝像機

本章參考官方教程&#xff1a;攝像機 本系列歷史文 OpengGL教程(一)—OpenGL環境的配置(GLFW3,GLAD) OpengGL教程(二)—渲染一個簡單的窗體 OpengGL教程(三)—使用VAO和VBO方式繪制三角形 OpengGL教程(四)—使用EBO方式繪制矩形 OpengGL教程(五)—紋理的應用 OpengGL教程(六)—…

安卓手機怎樣開啟雙WiFi加速

1. 小米/Redmi手機 路徑&#xff1a; 設置 → WLAN → 高級設置 → 雙WLAN加速 操作&#xff1a; 開啟功能后&#xff0c;可同時連接一個2.4GHz WiFi和一個5GHz WiFi&#xff08;或兩個不同路由器&#xff09;。 可選擇“智能選擇”或手動指定輔助網絡。 2. 華為/榮耀手機…

什么是八步工作法?

八步工作法&#xff0c;顧名思義&#xff0c;就是把一項工作拆分成八個步驟來完成。它的核心目的是讓工作變得更有條理&#xff0c;更高效&#xff0c;避免忙而無序&#xff0c;做到事事有著落&#xff0c;件件有結果。這個方法在很多企業和單位中都有應用&#xff0c;尤其適合…

前端Node.js的包管理工具npm指令

?npm&#xff08;Node Package Manager&#xff09;是Node.js的包管理工具&#xff0c;主要用于安裝、更新、刪除和管理JavaScript包。以下是前端開發中常用的npm命令及其用途?&#xff1a; 基本命令 npm提供了一系列命令行工具&#xff0c;用于執行各種包管理操作。以下是一…

掌握C語言文件操作:從理論到實戰指南

文件操作是C語言編程中不可或缺的一部分&#xff0c;它使得程序能夠持久化存儲數據&#xff0c;并在需要時高效讀寫。本文將從基礎概念到實戰技巧&#xff0c;系統講解C語言文件操作的核心知識點&#xff0c;并結合代碼示例幫助讀者深入理解。 一. 為什么需要文件操作&#xf…

Linux 線程:從零構建多線程應用:系統化解析線程API與底層設計邏輯

線程 線程的概述 在之前&#xff0c;我們常把進程定義為 程序執行的實例&#xff0c;實際不然&#xff0c;進程實際上只是維護應用程序的各種資源&#xff0c;并不執行什么。真正執行具體任務的是線程。 那為什么之前直接執行a.out的時候&#xff0c;沒有這種感受呢&#xf…

014_多線程

多線程 多線程創建線程方式一&#xff1a;繼承Thread類方式二&#xff1a;實現Runable接口方式三&#xff1a;實現Callbale接口 Thread的常用方法線程安全線程同步方式一&#xff1a;同步代碼塊同步方法方式三&#xff1a;Lock鎖 線性池創建線程池處理Runnable任務處理Callable…

機場跑道異物檢測數據集VOC+YOLO格式33793張31類別

數據集分辨率都是300x300,都是貼近地面拍攝&#xff0c;具體看圖片 據集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路徑的txt文件&#xff0c;僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數)&#xff1a;33793 標注數量(xml文件…

Spring Cloud 遠程調用

4.OpenFeign的實現原理是什么&#xff1f; 在使用OpenFeign的時候&#xff0c;主要關心兩個注解&#xff0c;EnableFeignClients和FeignClient。整體的流程分為以下幾個部分&#xff1a; 啟用Feign代理&#xff0c;通過在啟動類上添加EnableFeignClients注解&#xff0c;開啟F…

Unity中使用FMETP STREAM傳輸實時畫面

一、客戶端&#xff08;發送端&#xff09; 總體思路&#xff1a;先把畫面編碼Encoder&#xff0c;再發送給服務端 新建場景&#xff0c;創建一個實體&#xff0c;名為FMnet&#xff0c;添加組件FMNetworkManager&#xff0c;將NetworkType設置為客戶端Client&#xff0c;設置…

Baklib三步構建企業內容中臺

需求調研構建內容中臺 企業內容中臺建設的首要環節在于精準識別業務需求與知識管理痛點。通過Baklib 是什么類型的工具的定位分析可知&#xff0c;其作為知識管理中樞&#xff0c;能夠系統梳理客戶服務場景中的高頻咨詢、產品文檔更新需求及跨部門協作流程。在需求調研階段&am…

實現抗隱私泄漏的AI人工智能推理

目錄 什么是私人AI? 什么是可信執行環境? TEE 如何在 AI 推理期間保護數據? 使用 TEE 是否存在風險? 有哪些風險? Atoma 如何應對這些風險 為什么去中心化網絡是解決方案 人工智能推理過程中還有其他保護隱私的方法嗎? 私人人工智能可以實現什么? 隱私驅動的應…

一、TorchRec里邊的輸入輸出類型

TorchRec中的輸入和輸出格式 文章目錄 TorchRec中的輸入和輸出格式前言一、JaggedTensor1.1 核心概念1.2 核心屬性&#xff0c;也就是參數1.3 關鍵操作與方法 二、KeyedJaggedTensor2.1 核心概念2.2 核心屬性&#xff0c;也就是參數 3、KeyedTensor總結 前言 TorchRec具有其特…

JAVA實現在H5頁面中點擊鏈接直接進入微信小程序

在普通的Html5頁面中如何實現點擊URL鏈接直接進入微信小程序&#xff0c;不需要掃描小程序二維碼&#xff1f; 網上介紹的很多方法是在小程序后臺設置Schema&#xff0c;不過我進入我的小程序后臺在開發設置里面 沒有找到設置小程序Schema的地方&#xff0c;我是通過調用API接口…

uniapp解決上架華為應用市場審核要求-監聽權限的申請

支持android平臺全局監聽權限的申請。當申請權限時&#xff0c;會在頁面頂部顯示申請權限的目的。主要解決上架華為應用市場審核要求&#xff1a;APP在調用終端權限時&#xff0c;應同步告知用戶申請該權限的目的。 因為如果不提示&#xff0c;你上架應用市場會被打打回來 Tip…

文件IO5(JPEG圖像原理與應用)

JPEG圖像原理與應用 ? 基本概念 JPEG&#xff08;Joint Photographic Experts Group&#xff09;指的是聯合圖像專家組&#xff0c;是國際標準化組織ISO制訂并于1992年發布的一種面向連續色調靜止圖像的壓縮編碼標準&#xff0c;所以也被稱為JPEG標準。 同樣&#xff0c;JP…