更新時(shí)間:2020-09-21 17:13:13 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1929次
前面學(xué)習(xí)了什么是java對(duì)象排序以及為什么要對(duì)對(duì)象進(jìn)行排序的問(wèn)題,下面我們就來(lái)講講排序的方法——比較器對(duì)象排序方法的內(nèi)容,相信java零基礎(chǔ)的新手朋友們?cè)趯W(xué)習(xí)了前面文章的基礎(chǔ)上一定可以學(xué)會(huì)下面的內(nèi)容。
先來(lái)介紹什么是比較器,比較器是一個(gè)包含一個(gè)方法的對(duì)象,這個(gè)方法能夠?qū)蓚€(gè)對(duì)象進(jìn)行比較。則排序方法可以在需要執(zhí)行兩個(gè)對(duì)象之間的比較操作時(shí),將比較器應(yīng)用于這兩個(gè)對(duì)象。這是學(xué)習(xí)比較器對(duì)象排序方法的第一個(gè)需要知道的內(nèi)容。
對(duì)一個(gè)對(duì)象的compare To方法的定義應(yīng)該在某種意義上定義對(duì)象的自然順序。舉例來(lái)說(shuō),對(duì)于電話號(hào)碼本的例子,所有的條目就可以基于與條目相關(guān)的名字進(jìn)行理想排序。然而有時(shí)候,compare To不能提供想要的順序,或者更糟糕的,并沒(méi)有為一個(gè)對(duì)象定義compareTo方法。在這些情況下,程序員采用另外一種方式,指定一個(gè)稱為比較器(comparator)的外部比較方法。這種機(jī)制的優(yōu)點(diǎn)是,不同的比較器可以用在相同的數(shù)據(jù)上進(jìn)行不同的排序,或者基于不同的鍵進(jìn)行排序,在java語(yǔ)言中,比較器可以是任何一個(gè)實(shí)現(xiàn)java.util.Comparator接口的類。這個(gè)接口提供了下面的方法:

與前面討論過(guò)的compareTo方法一樣,compare方法返回一個(gè)表示兩個(gè)數(shù)值之間關(guān)系的整數(shù)。然而與compareTo方法不同的是,compare不與被比較的對(duì)象相關(guān)聯(lián)。結(jié)果,比較器并不是對(duì)象實(shí)現(xiàn)專有的;它必須基于從存取函數(shù)中取得的信息進(jìn)行比較。
作為比較器實(shí)現(xiàn)的一個(gè)例子,我們考慮一下字符串的不區(qū)分大小寫的比較的實(shí)現(xiàn),稱為Caseless Comparator。這種比較方法將兩個(gè)字符串對(duì)象都轉(zhuǎn)換成大寫表示,然后執(zhí)行標(biāo)準(zhǔn)的字符串比較:

比較的結(jié)果是,大小寫不同,拼寫相同的字符被排列在一起。例如,如果數(shù)組包含著兒童的繞口令:
Fuzzy Wuzzy was a bear.
Fuzzy Wuzzy had no hair .
Fuzzy Wuzzy wasn ’t fuzzy , wuzzy?
則這些文字可以被排序成下面的順序:
a bear. Fuzzy Fuzzy Fuzzy fuzzy, had hair.
no was wasn’t Wuzzy Wuzzy Wuzzy wuzzy?
這個(gè)結(jié)果應(yīng)與字符串對(duì)象的標(biāo)準(zhǔn)排列進(jìn)行比較,標(biāo)準(zhǔn)排列的輸出如下:
Fuzzy Fuzzy Fuzzy Wuzzy Wuzzy Wuzzy a bear .
fuzzy, had hair . no was wasnt wuzzy?
為了在排序中使用比較器,只需要用比較器中的Compare方法代替CompareTo方法即可。例如,下面是一個(gè)使用比較器對(duì)一Object數(shù)組中的值進(jìn)行排序的插入排序方法:

注意在這個(gè)描述中,我們沒(méi)有看到所包含的數(shù)值類型的細(xì)節(jié)。所有的數(shù)據(jù)都作為object進(jìn)行操作,而Object由比較器提供的compare方法進(jìn)行操作。
其實(shí)java實(shí)現(xiàn)對(duì)象排序可以分為兩種方式,一種是自然排序,另一種是定制排序,這篇文章介紹的比較器對(duì)象排序?qū)儆谧匀慌判蚍懂?,這種方法沒(méi)有使用范圍的局限性,所以希望大家都可以掌握比較器對(duì)象排序的方法,以更好的提高java編程能力。
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)