java的Comparator和Comparable
java的Comparator和Comparable
當(dāng)需要排序的集合或數(shù)組不是單純的數(shù)字型時(shí),通??梢允褂肅omparator或Comparable,以簡單的方式實(shí)現(xiàn)對象排序或自定義排序。
???? 一、Comparator
強(qiáng)行對某個(gè)對象collection進(jìn)行整體排序的比較函數(shù),可以將Comparator傳遞給Collections.sort或Arrays.sort。
接口方法:
? /**
?? * @return o1小于、等于或大于o2,分別返回負(fù)整數(shù)、零或正整數(shù)。
?? */
? int compare(Object o1, Object o2);
案例:
import java.util.Arrays;
import java.util.Comparator;
public class SampleComparator implements Comparator<String> {
? public int compare(String o1, String o2) {
??? return toInt(o1) - toInt(o2);
? }
? private int toInt(String str) {
??? str = str.replaceAll("一", "1");
??? str = str.replaceAll("二", "2");
??? str = str.replaceAll("三", "3");
??
??? return Integer.parseInt(str);
? }
? /**
?? * 測試方法
?? */
? public static void main(String[] args) {
??? String[] array = new String[] { "一二", "三", "二" };
??? Arrays.sort(array, new SampleComparator());
??? for (int i = 0; i < array.length; i++) {
????? System.out.println(array[i]);
??? }
? }
}
????? 二、Comparable
強(qiáng)行對實(shí)現(xiàn)它的每個(gè)類的對象進(jìn)行整體排序,實(shí)現(xiàn)此接口的對象列表(和數(shù)組)可以通過Collections.sort或Arrays.sort進(jìn)行自動排序。
接口方法:
? /**
?? * @return 該對象小于、等于或大于指定對象o,分別返回負(fù)整數(shù)、零或正整數(shù)。
?? */
? int compareTo(Object o);
假設(shè)對象User,需要按年齡排序:
public class User {
? private String id;
? private int age;
? public User(String id, int age) {
??? this.id = id;
??? this.age = age;
? }
? public int getAge() {
??? return age;
? }
? public void setAge(int age) {
??? this.age = age;
? }
? public String getId() {
??? return id;
? }
? public void setId(String id) {
??? this.id = id;
? }
}
改造后的對象:
import java.util.Arrays;
public class User implements Comparable<User> {
? private String id;
? private int age;
? public User(String id, int age) {
??? this.id = id;
??? this.age = age;
? }
? public int getAge() {
??? return age;
? }
? public void setAge(int age) {
??? this.age = age;
? }
? public String getId() {
??? return id;
? }
? public void setId(String id) {
??? this.id = id;
? }
? public int compareTo(User u) {
??? return this.age - u.getAge();
? }
? /**
?? * 測試方法
?? */
? public static void main(String[] args) {
??? User[] users = new User[] { new User("a", 30), new User("b", 20) };
??? Arrays.sort(users);
??? for (int i = 0; i < users.length; i++) {
????? User user = users[i];
????? System.out.println(user.getId() + " " + user.getAge());
??? }
? }
}
????? 三、Comparator和Comparable的區(qū)別
? 先看一下使用Comparator對User集合實(shí)現(xiàn)排序的方式:一個(gè)類實(shí)現(xiàn)了Camparable接口則表明這個(gè)類的對象之間是可以相互比較的,這個(gè)類對象組成的集合就可以直接使用sort方法排序。
Comparator可以看成一種算法的實(shí)現(xiàn),將算法和數(shù)據(jù)分離,Comparator也可以在下面兩種環(huán)境下使用:
1、類的設(shè)計(jì)師沒有考慮到比較問題而沒有實(shí)現(xiàn)Comparable,可以通過Comparator來實(shí)現(xiàn)排序而不必改變對象本身
2、可以使用多種排序標(biāo)準(zhǔn),比如升序、降序等
在TreeSet和TreeMap中添加的自定義對象必須實(shí)現(xiàn)Comparable接口
------------------------------------------------------------
關(guān)于引用數(shù)據(jù)類型的排序(自然排序和客戶化排序):
1.對象本身實(shí)現(xiàn)Comparable接口,那么該類的實(shí)例就是可以排序的(實(shí)現(xiàn)其comparTo()方法).
只要實(shí)現(xiàn)了Comparable接口,就可以調(diào)用Collections的sort方法對集合中的元素排序.
2.實(shí)現(xiàn)Comparator接口的一個(gè)實(shí)例也可以實(shí)現(xiàn)排序功能.
看一下Comparator的全部內(nèi)容:
public?interface?Comparator?{
??int?compare(Object?o1,?Object?o2);
??boolean?equals(Object?obj);
}
定義了兩個(gè)方法,我們一般都只需要實(shí)現(xiàn)compare方法。
為什么呢?
因?yàn)樗凶远x類默認(rèn)extends?Object,而Object中已經(jīng)將equals()實(shí)現(xiàn)
Comparator一般都作為一個(gè)匿名類出現(xiàn),對于沒有實(shí)現(xiàn)Comparable的對象的集合,排序的時(shí)候
需要指定一個(gè)Comparator.
這里舉例說明
對于實(shí)現(xiàn)了Comparable的類(自然排序)我們就用最簡單的Integer
List?list=new?ArrayList();
list.add(new?Integer(3));
list.add(new?Integer(53));
list.add(new?Integer(34));
Collections.sort(list);
對于沒有實(shí)現(xiàn)Comparable的,我們就用Object,按照hashCode大小來排序.
List?list=?new?ArrayList();
list.add(new?Object());
list.add(new?Object());
list.add(new?Object());
Collections.sort(list,new?Comparator(){?public?int?compare(Object?o1,?Object?o2){
????????????????????return?(o1.hashCode()-o2.hashCode());
????????????????})
這里定義了一個(gè)排序規(guī)則,以匿名類的形式出現(xiàn),當(dāng)然你也可以定義一個(gè)自定義的類實(shí)現(xiàn)Comparator,
這樣這個(gè)“排序規(guī)則”就能得以保存。
那Comparable?和?Comparator?接口有什么區(qū)別呢?
“白 話文”的解釋:用自定義類實(shí)現(xiàn)Comparable接口,那么這個(gè)類就具有排序功能,Comparable和具體你要進(jìn)行排序的類的實(shí)例邦定。而 Comparator比較靈活,它沒有和任何類綁定,實(shí)現(xiàn)它的自定義類僅僅定義了一種排序方式或排序規(guī)則。不言而喻,這種方式比較靈活。我們的要排序的類 可以分別和多個(gè)實(shí)現(xiàn)Comparator接口的類綁定,從而達(dá)到可以按自己的意愿實(shí)現(xiàn)按多種方式排序的目的。Comparable——“靜態(tài)綁定排 序”,Comparator——“動態(tài)綁定排序”。
轉(zhuǎn)載于:https://www.cnblogs.com/Free-Thinker/p/3883793.html
總結(jié)
以上是生活随笔為你收集整理的java的Comparator和Comparable的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSS+JS鼠标悬停单元格变色
- 下一篇: 普通用户Mysql 5.6.13 主从,