日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

java中的Comparator和Comparable比較器的用法

 收藏小管 2017-07-04

Comparable和Comparator都是用來(lái)實(shí)現(xiàn)集合中的排序的,Comparator位于包java.util下,而Comparable位于包java.lang下,Comparable是一個(gè)對(duì)象本身就已經(jīng)支持自比較所需要實(shí)現(xiàn)的接口(如 String、Integer 自己就可以完成比較大小操作),是內(nèi)部定義的排序;而后者在一個(gè)獨(dú)立的類中實(shí)現(xiàn)比較,是外部實(shí)現(xiàn)的排序。 如果一個(gè)類沒(méi)有實(shí)現(xiàn)Comparable接口,或是這個(gè)對(duì)象不支持自比較或者自比較函數(shù)不能滿足你的要求時(shí),可以通過(guò)Comparator來(lái)實(shí)現(xiàn)比較算法進(jìn)行排序,并且為了使用不同的排序標(biāo)準(zhǔn)做準(zhǔn)備,比如:升序、降序。所以,如想實(shí)現(xiàn)排序,就需要讓類對(duì)象自身實(shí)現(xiàn)Comparable接口,重寫其中的compareTo(T o)方法;或在外部定義比較器實(shí)現(xiàn)Comparator接口,重寫其compare(T o1,T o2)方法。前者只有一個(gè)參數(shù),后者有兩個(gè)參數(shù)。排序時(shí)可以調(diào)用java.util.Arrays.sort()來(lái)排序?qū)ο髷?shù)組,或是調(diào)用集合中的sort()方法就可以按照相應(yīng)的排序方法進(jìn)行排序。方法返回一個(gè)基本類型的整型,返回負(fù)數(shù)表示o1小于o2,返回0表示o1和o2相等,返回正數(shù)表示o1大于o2。 

用 Comparator 是策略模式(strategy design pattern),就是不改變對(duì)象自身,而用一個(gè)策略對(duì)象(strategy object)來(lái)改變它的行為。比如:你想對(duì)整數(shù)采用絕對(duì)值大小來(lái)排序,Integer 是不符合要求的,你不需要去修改 Integer 類(實(shí)際上你也不能這么做)去改變它的排序行為,只要使用一個(gè)實(shí)現(xiàn)了Comparator接口的對(duì)象來(lái)實(shí)現(xiàn)控制它的排序就行了。

例子:

import java.util.Arrays;import java.util.Comparator;class Person implements Comparable{ private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return this.name; } public int getAge() { return this.age; } @Override public String toString() { return ''+this.name+' '+this.age; } @Override public int compareTo(Person o) { if (this.getName().compareTo(o.getName()) != 0) return this.getName().compareTo(o.getName()); else { if (this.getAge() < o.getAge()) return -1; else if (this.getAge() > o.getAge()) return 1; else return 0; } }}class Cmp implements Comparator { @Override public int compare(Object arg0, Object arg1) { Person a = (Person) arg0; Person b = (Person) arg1; if (a.getName().compareTo(b.getName()) != 0) return a.getName().compareTo(b.getName()); else { if (a.getAge() < b.getAge()) return -1; else if (a.getAge() > b.getAge()) return 1; else return 0; } }}public class Main { public static void main(String[] args) { Person[] p = new Person[4]; p[0] = new Person('ZZZ',19); p[1] = new Person('AAA', 109); p[2] = new Person('AAA', 19); p[3] = new Person('YYY',100);// Arrays.sort(p);//調(diào)用自有的排序 Arrays.sort(p, new Cmp());//調(diào)用Comparator定義的排序 System.out.println(Arrays.toString(p)); }}


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多