更新時間:2020-09-21 17:13:13 來源:動力節(jié)點(diǎn) 瀏覽1770次
前面學(xué)習(xí)了什么是java對象排序以及為什么要對對象進(jìn)行排序的問題,下面我們就來講講排序的方法——比較器對象排序方法的內(nèi)容,相信java零基礎(chǔ)的新手朋友們在學(xué)習(xí)了前面文章的基礎(chǔ)上一定可以學(xué)會下面的內(nèi)容。
先來介紹什么是比較器,比較器是一個包含一個方法的對象,這個方法能夠?qū)蓚€對象進(jìn)行比較。則排序方法可以在需要執(zhí)行兩個對象之間的比較操作時,將比較器應(yīng)用于這兩個對象。這是學(xué)習(xí)比較器對象排序方法的第一個需要知道的內(nèi)容。
對一個對象的compare To方法的定義應(yīng)該在某種意義上定義對象的自然順序。舉例來說,對于電話號碼本的例子,所有的條目就可以基于與條目相關(guān)的名字進(jìn)行理想排序。然而有時候,compare To不能提供想要的順序,或者更糟糕的,并沒有為一個對象定義compareTo方法。在這些情況下,程序員采用另外一種方式,指定一個稱為比較器(comparator)的外部比較方法。這種機(jī)制的優(yōu)點(diǎn)是,不同的比較器可以用在相同的數(shù)據(jù)上進(jìn)行不同的排序,或者基于不同的鍵進(jìn)行排序,在java語言中,比較器可以是任何一個實(shí)現(xiàn)java.util.Comparator接口的類。這個接口提供了下面的方法:
與前面討論過的compareTo方法一樣,compare方法返回一個表示兩個數(shù)值之間關(guān)系的整數(shù)。然而與compareTo方法不同的是,compare不與被比較的對象相關(guān)聯(lián)。結(jié)果,比較器并不是對象實(shí)現(xiàn)專有的;它必須基于從存取函數(shù)中取得的信息進(jìn)行比較。
作為比較器實(shí)現(xiàn)的一個例子,我們考慮一下字符串的不區(qū)分大小寫的比較的實(shí)現(xiàn),稱為Caseless Comparator。這種比較方法將兩個字符串對象都轉(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?
這個結(jié)果應(yīng)與字符串對象的標(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方法即可。例如,下面是一個使用比較器對一Object數(shù)組中的值進(jìn)行排序的插入排序方法:
注意在這個描述中,我們沒有看到所包含的數(shù)值類型的細(xì)節(jié)。所有的數(shù)據(jù)都作為object進(jìn)行操作,而Object由比較器提供的compare方法進(jìn)行操作。
其實(shí)java實(shí)現(xiàn)對象排序可以分為兩種方式,一種是自然排序,另一種是定制排序,這篇文章介紹的比較器對象排序?qū)儆谧匀慌判蚍懂牐@種方法沒有使用范圍的局限性,所以希望大家都可以掌握比較器對象排序的方法,以更好的提高java編程能力。
初級 202925
初級 203221
初級 202629
初級 203743