国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

java comparable 和 comparator

why_rookie / 3052人閱讀

摘要:一內(nèi)部排序接口實現(xiàn)該接口的類,支持自然排序內(nèi)排序。方法與方法不一致。在有序集合看來和是相等的,因此第個鍵無法被添加到集合中。

一、Comparable(內(nèi)部排序接口)

實現(xiàn)該接口的類,支持自然排序(內(nèi)排序)。Arrays.sort(Object[])和Collection.sort(Object[])要求對象必須實現(xiàn)Comparable接口

文檔中指出:

如果該對象大于指定對象,返回正整數(shù)

如果該對象等于指定對象,返回0

如果該對象小于指定對象,返回負(fù)整數(shù)

建議(x.compareTo(y)==0) == x.equals(y)

e.compareTo(null) 應(yīng)該拋出NullPointerException

鍵a和b被添加到?jīng)]有指定顯示比較器的有序集合中。if(!a.equals(b) && a.compareTo(b))(eqauls方法與compareTo方法不一致)。在有序集合看來a和b是相等的,因此第2個鍵無法被添加到集合中。

針對第6點可以舉個例子:
BigDecimal類的compareTo 與 equals 方法不一致。

public static void main(String[] args) {
        Map map = new HashMap();
        BigDecimal b1 = new BigDecimal(1.0);
        BigDecimal b2 = new BigDecimal(1.00);
        map.put(b1,"c1");
        map.put(b2,"c2");
        System.out.println(map.get(b1) + " " + map.get(b2)); // 輸出 c1、c2
        TreeSet set = new TreeSet();
        set.add(b1);
        set.add(b2);
        for(BigDecimal b : set) {
            System.out.println(b.floatValue()); // 只打印出1.0
        }
    }

HashMap通過 hashCode + equals 方法進行比較。 TreeSet 通過 compareTo進行比較。

在effctiveJava中 指出,Comparable接口,具有與equals方法一樣的自反、傳遞、對稱。所以同樣與equals具有同樣的特征:
沒有一種簡單的方法可以做到,在擴展一個新的可實例化的類時,既增加了新的特征,又保持了compareTo的約定(見我的文章)

對于如何編寫compareTo方法,effectivejava中,同樣給出了以下建議。并且推薦,自定義的類,可以考慮實現(xiàn)Comparable接口

實參為null,compareTo方法應(yīng)拋出NullPointerException

參數(shù)不合適,應(yīng)拋出ClassCastException

比較對象引用域,通過遞歸比較

如果對象有多個域,則從最重要的域開始比較

compareTo沒有指定返回值的大小,而只是指定返回值的符號,可利用這點進行優(yōu)化

例子:

public int compareTo(Object obj) {
        if(obj == null) {
            throw new NullPointerException(); // 滿足第1點
        }
        if(!(obj instanceof MyComparable)) {
            throw new ClassCastException(); // 滿足第2點
        }
        MyComparable o = (MyComparable) obj;
        int x = o.p.compareTo(p);// p 是一個對象 ,滿足第3、4點
        if(x == 0) {
            return o.y - y;  // y 是個int型, 滿足第5點,
           //對于第5點請注意,確保 o.y -y 不會溢出!!!
        }
        return x;
    }
二、Comparator(外部比較器)

可自己制定比較規(guī)則。在TreeSet中有應(yīng)用,TresSet利用Comparator接口實現(xiàn)模板設(shè)計模式

文檔中指出:

如果該對象大于指定對象,返回正整數(shù)

如果該對象等于指定對象,返回0

如果該對象小于指定對象,返回負(fù)整數(shù)

建議(x.compareTo(y)==0) == x.equals(y)

必須確保關(guān)系的傳遞性。即compare(x,y) > 0 且 compare(y,z) > 0,那么 compare(x,z) > 0

在本人看來,Comparable 與 Comparator 差別不大

疑問:那么Comparator具體的使用在什么地方呢?

JAVA API 的String 類 默認(rèn)實現(xiàn)了Comparable接口,有默認(rèn)的排序方式,但是如果我們想使用自己的排序方式呢?比如按照長度排序,那么就可以使用Comparator接口了。

class LengthComparator implements Comparator {
    @Override
    public int compare(String o1, String o2) {
        return o1.length() - o2.length();
    }
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/70543.html

相關(guān)文章

  • Java Comparable vs Comparator

    摘要:和方法可以對數(shù)組進行排序,但是這種方法排序要求對象所在的類必須實現(xiàn)接口,此接口用于指定排序規(guī)則如果一個類已經(jīng)開發(fā)完成,但是在此類建立的初期并沒有實現(xiàn)接口,此時肯定是無法進行對象排序操作的,所以為了解決這個問題,定義了另一個比較器的操 Collections.sort() 和 Arrays.sort()方法可以對Object數(shù)組進行排序,但是這種方法排序要求對象所在的類必須實現(xiàn)Compa...

    KitorinZero 評論0 收藏0
  • Comparable and Comparator

    摘要:中的一切類都是繼承于,在中實現(xiàn)了函數(shù)所以,其它所有的類也相當(dāng)于都實現(xiàn)了該函數(shù)。是比較和的大小。返回負(fù)數(shù),意味著比小返回零,意味著等于返回正數(shù),意味著大于。 Comparable Comparable 是排序接口。 Collection.sort() 和Arrays.sort()都支持可以排序?qū)崿F(xiàn)Comparable接口的類的對象的List列表(或數(shù)組) 換而言之, 如果數(shù)組或列表想支持...

    Barrior 評論0 收藏0
  • Java? 教程(對象排序)

    對象排序 List l可以如下排序。 Collections.sort(l); 如果List包含String元素,它將按字母順序排序,如果它由Date元素組成,它將按時間順序排序,這是怎么發(fā)生的?String和Date都實現(xiàn)了Comparable接口,Comparable實現(xiàn)為類提供了自然的順序,允許該類的對象自動排序,下表總結(jié)了一些實現(xiàn)Comparable的更重要的Java平臺類。 類 自然...

    Chao 評論0 收藏0
  • 如何理解java里的ComparatorComparable

    摘要:,又名比較器,是為了比較兩個對象的大小而抽象出的一個接口。在排序的時候常需要實現(xiàn)這個接口來定制比較規(guī)則。若函數(shù)的返回值大于,那么在排序后會將放在的后面。 Comparator,又名比較器,是為了比較兩個對象的大小而抽象出的一個接口。在排序的時候常需要實現(xiàn)這個接口來定制比較規(guī)則。 但是很多人用的時候不清楚該如何使用這個接口,下面我就講一下這個接口的正確使用方法!這個接口里有一個必須實現(xiàn)的...

    sydMobile 評論0 收藏0
  • Java ComparatorComparable辨析

    摘要:與辨析聲明文章均為本人技術(shù)筆記,轉(zhuǎn)載請注明出處比較三種狀態(tài)根據(jù)需求定義序升序降序返回負(fù)數(shù),表示比較兩元素滿足序,無須調(diào)整,返回,表示比較兩元素相等,無須調(diào)整位置,返回正數(shù),表示比較兩元素不滿足序,按序調(diào)整位置對象內(nèi)部排序源碼繼承接口的對象必 Comparator與Comparable辨析 聲明 文章均為本人技術(shù)筆記,轉(zhuǎn)載請注明出處:[1] https://segmentfault.co...

    wenhai.he 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<