Arrays.sort()用来自定义排序的使用
compareTo方法
`public int compareTo(String anotherString)`按字典順序比較兩個(gè)字符串。該比較基于字符串中各個(gè)字符的 Unicode 值。按字典順序?qū)⒋?String 對(duì)象表示的字符序列與參數(shù)字符串所表示的字符序列進(jìn)行比較。如果按字典順序此 String 對(duì)象位于參數(shù)字符串之前,則比較結(jié)果為一個(gè)負(fù)整數(shù)。如果按字典順序此 String 對(duì)象位于參數(shù)字符串之后,則比較結(jié)果為一個(gè)正整數(shù)。如果這兩個(gè)字符串相等,則結(jié)果為 0;compareTo 只在方法 equals(Object) 返回 true 時(shí)才返回 0。
這是字典排序的定義。如果這兩個(gè)字符串不同,那么它們要么在某個(gè)索引處的字符不同(該索引對(duì)二者均為有效索引),要么長(zhǎng)度不同,或者同時(shí)具備這兩種情況。如果它們?cè)谝粋€(gè)或多個(gè)索引位置上的字符不同,假設(shè) k 是這類索引的最小值;則在位置 k 上具有較小值的那個(gè)字符串(使用 < 運(yùn)算符確定),其字典順序在其他字符串之前。在這種情況下,compareTo 返回這兩個(gè)字符串在位置 k 處兩個(gè)char 值的差,即值:
this.charAt(k)-anotherString.charAt(k)
如果沒(méi)有字符不同的索引位置,則較短字符串的字典順序在較長(zhǎng)字符串之前。在這種情況下,compareTo 返回這兩個(gè)字符串長(zhǎng)度的差,即值:
this.length()-anotherString.length()
指定者:
接口 Comparable 中的 compareTo
參數(shù):
anotherString - 要比較的 String。
返回:
如果參數(shù)字符串等于此字符串,則返回值 0;如果此字符串按字典順序小于字符串參數(shù),則返回一個(gè)小于 0 的值;如果此字符串按字典順序大于字符串參數(shù),則返回一個(gè)大于 0 的值
comparator接口與Comparable接口的區(qū)別
他們都是java的一個(gè)接口, 并且是用來(lái)對(duì)自定義的class比較大小的,
什么是自定義class: 如 public class Person{ String name; int age }.
當(dāng)我們有這么一個(gè)personList,里面包含了person1, person2, persion3…, 我們用Collections.sort( personList ),
是得不到預(yù)期的結(jié)果的. 這時(shí)肯定有人要問(wèn), 那為什么可以排序一個(gè)字符串list呢:
如 StringList{“hello1” , “hello3” , “hello2”}, Collections.sort( stringList ) 能夠得到正確的排序, 那是因?yàn)?br /> String 這個(gè)對(duì)象已經(jīng)幫我們實(shí)現(xiàn)了 Comparable接口 , 所以我們的 Person 如果想排序, 也要實(shí)現(xiàn)一個(gè)比較器。
Comparator 和 Comparable 的區(qū)別
Comparable
Comparable 定義在 Person類的內(nèi)部:
public class Persion implements Comparable {…比較Person的大小…},
因?yàn)橐呀?jīng)實(shí)現(xiàn)了比較器,那么我們的Person現(xiàn)在是一個(gè)可以比較大小的對(duì)象了,它的比較功能和String完全一樣,可以隨時(shí)隨地的拿來(lái)
比較大小,因?yàn)镻erson現(xiàn)在自身就是有大小之分的。Collections.sort(personList)可以得到正確的結(jié)果。
Comparator
Comparator 是定義在Person的外部的, 此時(shí)我們的Person類的結(jié)構(gòu)不需要有任何變化,如
public class Person{ String name; int age },
然后我們另外定義一個(gè)比較器:
public PersonComparator implements Comparator() {…比較Person的大小…},
在PersonComparator里面實(shí)現(xiàn)了怎么比較兩個(gè)Person的大小. 所以,用這種方法,當(dāng)我們要對(duì)一個(gè) personList進(jìn)行排序的時(shí)候,
我們除了了要傳遞personList過(guò)去, 還需要把PersonComparator傳遞過(guò)去,因?yàn)樵趺幢容^Person的大小是在PersonComparator
里面實(shí)現(xiàn)的, 如:
Collections.sort( personList , new PersonComparator() ).
Comparable:
實(shí)現(xiàn)Comparable接口要覆蓋compareTo方法, 在compareTo方法里面實(shí)現(xiàn)比較:
public class Person implements Comparable {
String name;
int age
public int compareTo(Person another) {
int i = 0;
i = name.compareTo(another.name); // 使用字符串的比較
if(i == 0) { // 如果名字一樣,比較年齡, 返回比較年齡結(jié)果
return age - another.age;
} else {
return i; // 名字不一樣, 返回比較名字的結(jié)果.
}
}
}
這時(shí)我們可以直接用 Collections.sort( personList ) 對(duì)其排序了.
Comparator:
實(shí)現(xiàn)Comparator需要覆蓋 compare 方法:
public class Person{
String name;
int age
}
class PersonComparator implements Comparator {
public int compare(Person one, Person another) {
int i = 0;
i = one.name.compareTo(another.name); // 使用字符串的比較
if(i == 0) { // 如果名字一樣,比較年齡,返回比較年齡結(jié)果
return one.age - another.age;
} else {
return i; // 名字不一樣, 返回比較名字的結(jié)果.
}
}
}
Collections.sort( personList , new PersonComparator()) 可以對(duì)其排序
4:總結(jié)
兩種方法各有優(yōu)劣, 用Comparable 簡(jiǎn)單, 只要實(shí)現(xiàn)Comparable 接口的對(duì)象直接就成為一個(gè)可以比較的對(duì)象,
但是需要修改源代碼, 用Comparator 的好處是不需要修改源代碼, 而是另外實(shí)現(xiàn)一個(gè)比較器, 當(dāng)某個(gè)自定義
的對(duì)象需要作比較的時(shí)候,把比較器和對(duì)象一起傳遞過(guò)去就可以比大小了, 并且在Comparator 里面用戶可以自
己實(shí)現(xiàn)復(fù)雜的可以通用的邏輯,使其可以匹配一些比較簡(jiǎn)單的對(duì)象,那樣就可以節(jié)省很多重復(fù)勞動(dòng)了。
引用:https://www.cnblogs.com/sunflower627/p/3158042.html
總結(jié)
以上是生活随笔為你收集整理的Arrays.sort()用来自定义排序的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux重启后地址不是之前设置的静态地
- 下一篇: 平衡二叉树模板