作為處理數(shù)據(jù)的開發(fā)人員,我們需要的最常見的功能之一是排序 - 通過能夠?qū)?shù)據(jù)進(jìn)行排序,我們可以優(yōu)化算法以更快地運(yùn)行,并在一小部分時(shí)間內(nèi)找到所需的數(shù)據(jù)。在今天的課程中,我們將討論 Java 集合排序()。作為一個(gè)快速的思想實(shí)驗(yàn):想象一下,你正在通過一所大學(xué)的名冊(cè)搜索一個(gè)名字。這所學(xué)??赡苡谐汕先f的學(xué)生。
如果您獲得的花名冊(cè)不是按字母順序排列的,則需要翻閱每一頁并仔細(xì)查看,以確保您沒有在任何地方跳過一個(gè)名字,直到您最終找到您要查找的名字。另一方面,如果花名冊(cè)按字母順序排列,您不僅必須在搜索時(shí)不那么嚴(yán)格,而且您可以輕松地跳轉(zhuǎn)到花名冊(cè)中具有相同第一個(gè)字母的部分,并繼續(xù)以大跳躍的方式跳轉(zhuǎn)頁面,直到您找到您要找的人。您使用的數(shù)據(jù)越多,盡可能有效和高效地使用它就越重要。在本文中,我們將介紹如何使用集合排序方法對(duì) Java 中的任何列表實(shí)現(xiàn)(包括 ArrayList)進(jìn)行排序。
如何使用 Java 集合排序方法對(duì) Java 中的數(shù)組列表進(jìn)行排序
我們來談?wù)?Java 集合排序方法。java.util 軟件包包含許多有用的實(shí)用程序和軟件包,這些實(shí)用程序和軟件包經(jīng)常被開發(fā)人員使用,包括 ArrayList。假設(shè)您有以下簡(jiǎn)單的程序:您希望能夠打印出顏色列表,但按字母順序排列。你怎么會(huì)這樣做?使用 java.util.集合,排序就像一行一樣簡(jiǎn)單:噠噠!您的顏色列表現(xiàn)已就地排序。如果您要打印出列表,那么您將獲得以下輸出:這有多容易?!使用 Collections.sort() 按升序?qū)φ麛?shù)、浮點(diǎn)數(shù)或任何其他簡(jiǎn)單數(shù)據(jù)類型的列表進(jìn)行排序同樣簡(jiǎn)單。
但是,如果要按降序排序,該怎么辦?在有些情況下,這是有道理的——想象一下,你有一個(gè)特定班級(jí)的考試成績(jī)列表,你想弄清楚誰是得分最高的學(xué)生。按降序(最高分優(yōu)先)對(duì)列表進(jìn)行排序會(huì)更有意義,這樣您正在尋找的答案就在頂部。值得慶幸的是,Collection.sort()被可選的第二個(gè)參數(shù)覆蓋,它允許您執(zhí)行以下操作:但是什么是比較器?好吧,比較器只是一個(gè)比較兩個(gè)輸入并返回一個(gè)數(shù)字的函數(shù),表示哪個(gè)輸入先出現(xiàn)。如果要對(duì)基元數(shù)據(jù)類型的數(shù)組列表進(jìn)行排序,則 Java 集合已經(jīng)為您提供了反向Order() 比較器??梢赃@樣稱呼它:現(xiàn)在,顏色已經(jīng)就地進(jìn)行了反向排序,因此,如果您將其打印出來,您將獲得以下輸出:
如何使用集合對(duì) Java 中的非基元數(shù)據(jù)類型進(jìn)行排序
到目前為止,您已經(jīng)看到使用Java中的字符串或整數(shù)對(duì)數(shù)組列表進(jìn)行排序集合.排序()方法就像一行代碼一樣簡(jiǎn)單。但通常,您的數(shù)組列表將存儲(chǔ)非基元數(shù)據(jù)類型。在處理具有更復(fù)雜屬性的數(shù)據(jù)時(shí),您將需要編寫類來表示這些對(duì)象,以及如何使用它們的屬性將它們相互比較。為了探索這方面的一個(gè)示例,讓我們重溫對(duì)顏色列表進(jìn)行排序的示例,但這一次,我們將對(duì) Color 對(duì)象進(jìn)行排序,而不是對(duì)字符串進(jìn)行排序。
我們的基本 Color 類可能如下所示:為了使我們的 Color 類與 Collections.sort() 兼容,以便集合可以了解如何比較和排序 Color 對(duì)象,我們需要進(jìn)行兩個(gè)小的修改:
1.使顏色成為可比較對(duì)象(添加實(shí)現(xiàn)可比較<對(duì)象>)
2.重寫類中的 compareTo 方法(重寫公共整型比較To(對(duì)象 o))
通過這些修改,我們的類現(xiàn)在看起來像這樣:請(qǐng)注意,顏色的 compareTo 方法只是調(diào)用字符串的 compareTo 方法;排序?qū)醋帜疙樞蛲瓿?。例如,如果我們想按紅色值升序排序,我們可以將 return 語句替換為 return this.r - c.r;(如果我們想按綠色值降序排序,它將返回 c.g - this.g;)?,F(xiàn)在,如果我們調(diào)用顏色數(shù)組列表而不僅僅是字符串,它將起作用,因?yàn)榧现廊绾伪容^顏色對(duì)象。
如果不想使對(duì)象實(shí)現(xiàn)可比較<對(duì)象>,也可以為類編寫一個(gè)比較器,并將其傳遞到 2 參數(shù) Collection.sort() 方法中。比較器重寫公共整型比較方法(對(duì)象一、對(duì)象二),而 Collections.sort() 方法在排序時(shí)使用它來比較對(duì)象。下面實(shí)現(xiàn)了 SortByName 和 SortByRed 比較器的示例:這樣,您現(xiàn)在可以在沒有實(shí)際實(shí)現(xiàn)可比較的 Color 類的情況下進(jìn)行調(diào)用,并且它仍然有效。有時(shí),您將看到這是使用 lambda 函數(shù)以內(nèi)聯(lián)方式完成的。lambda 函數(shù)本質(zhì)上是一個(gè)無名稱函數(shù),您可以在調(diào)用它的代碼行中定義它。
當(dāng)您只需要為一個(gè)特定實(shí)例調(diào)用一個(gè)函數(shù)并且不想在其他地方定義一個(gè)完整的單獨(dú)函數(shù)時(shí),它們非常有用。SortByName 比較器可以使用 lambda 函數(shù)以內(nèi)聯(lián)方式定義,如下所示:您可能已經(jīng)猜到了,(a, b) 表示 lambda 函數(shù)(要比較的兩個(gè)對(duì)象)的參數(shù)。->表示接下來是 lambda 函數(shù)定義。僅此而已!您現(xiàn)在已經(jīng)看到了使用集合包在 Java 中對(duì)數(shù)組列表進(jìn)行排序的最常用方法。