亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

深入理解Collections API

2019-11-18 11:11:26
字體:
來源:轉載
供稿:網友

一個 List l 可能被做如下排序:

Collections.sort(l);

假如這個 list 由 String 元素所組成, 那么它將按詞典排序法(按字母順序)進行排序; 假如它是由 Date 元素所組成, 那么它將按年代順序來排序。 java 怎么會知道該怎么做呢? 這一定是個魔術! 其實不然。實際上, String 和 Date 均實現了Comparable接口。 Comparable 接口為一個類提供一個 自然排序( natural ordering), 它答應那個類的對象被自動排序。下表列出了實現了Comparable 的JDK類:

類 自然排序

Byte 帶符號的數字排序

Character 不帶符號的數字排序

Long 帶符號的數字排序

Integer 帶符號的數字排序

Short 帶符號的數字排序

Double 帶符號的數字排序

Float 帶符號的數字排序

BigInteger 帶符號的數字排序

BigDecimal 帶符號的數字排序

File 依靠系統的按路徑名字母順序排序

String 按字母順序排序

Date 按年代順序排序

CollationKey 特定字符集按字母順序排序

假如你要為一個其元素沒有實現 Comparable的列表排序,Collections.sort(list) 將扔出一個 ClassCastException。類似的,假如你要為一個其元素沒有作相互比較的列表進行排序, Collections.sort 將扔出一個 ClassCastException. 能夠被相互比較的元素被稱作 mutually comparable(可相互比較的)。 雖然不同類型的元素有可能被相互比較,但以上列出的任何JDK類型都不答應在類之間的比較 (inter-class comparison)。

假如你只是要為可比較的元素的列表進行排序,或為它們創建排序的對象集, 則這就是你實際需要了解的全部有關 Comparable 接口的內容。假如你要實現你自己的 Comparable 類型,則下一節將會引起你的愛好。

編寫你自己的 Comparable 類型

Comparable 接口由一個單一的方法構成:

public interface Comparable {

public int compareTo(Object o);

}

compareTo 方法將接收對象與特定對象進行比較,并在接收對象小于、等于或大于特定對象時分別返回負整數、空或一個正整數。假如特定對象不能與接收對象相比較,該方法扔出一個ClassCastException. 這是一個表示某人姓名的類(a class rePResenting a person´s name), 它實現了 Comparable:

import java.util.*;

public class Name implements Comparable {

private String firstName, lastName;

public Name(String firstName, String lastName) {if (firstName==null lastName==null)

throw new NullPointerException();

this.firstName = firstName;

this.lastName = lastName;

}

public String firstName() {return firstName;}

public String lastName() {return lastName;}

public boolean equals(Object o) {

if (!(o instanceof Name))

return false;

Name n = (Name)o;return n.firstName.equals(firstName) &&n.lastName.equals(lastName);

}

public int hashCode() {

return 31*firstName.hashCode() + lastName.hashCode();

}

public String toString() {return firstName + " " + lastName;}

public int compareTo(Object o) {Name n = (Name)o;

int lastCmp = lastName.compareTo(n.lastName);

return (lastCmp!=0 ? lastCmp :

firstName.compareTo(n.firstName));

}}

為了使這個例子短一些,該類受到了一點限制:它不支持中間名,它要求必須同時具有first name 和 last name, 而這不是在全世界都通用的。盡管如此,這個例子仍有幾個重要之處:

Name 對象是不變的( immutable)。作為相等、不變類型的所有其它事情就是如何做的問題,非凡是對那些將被用來作為 Sets 中的元素或 Maps 中的鍵的對象來說,更是如此。假如你對這些 對象集 中的元素或鍵做了更改,這些 對象集 將中斷。

構造函數可檢查它的參數是否為 null。 這可以保證所有的Name 對象都能很好地形成。因而沒有其它方法會扔出NullPointerException.

hashCode 方法被重新定義。對重新定義 equals 方法的任意類來說,這是必需的(essential)。 一般約定(general contract)需要 Object.equals. (Equal 對象必須具有相等的哈希代碼) 。

假如特定對象為 null,或一個不適當的類型, equals 方法則返回 false。 在這種情況下, compareTo 方法扔出一個運行時異常。這兩個行為都是各自方法的一般約定所必需的。

toString 方法已被重新定義,從而可以以人們能夠讀懂的形式打印 Name 。這總是一個好主意,非凡是對要被放入對象集 中的對象來說,更有益處。各種 對象集 類型的 toString 方法依靠它們的元素、鍵和值的 toString 方法。

由于這一節介紹的是有關元素排序的問題,因而讓我們稍微多談一點 Name 的 compareTo 方法。它實現標準的姓名-排序算法,在該算法中,last name 優先于 first name。這恰恰是你在一個natural ordering(自然排序)中所想要的。 假如自然排序不自然,那才輕易引起混亂呢!

請看 compareTo 是如何被實現的,因為它是相當典型的。首先,你將 Object 參數轉換為適當類型; 假如參數類型是不適當的,則會扔出一個適當的異常(ClassCastException);那么你應該比較對象的最重要部分(在此案例中為 last name)。通常,你可以使用該部分的類型的自然排序。 在次案例中,該部分是一個 String, 并且自然的(按詞典順序的)排序正是所要求的。假如比較的結果是空(它表示等同性)之外的其它東西,你就做完了:你可以返回結果。 假如最重要的部分是相等的,你就應該繼續比較次重要部分。在此案例中,只有兩個部分 (first name and last name)。 假如有更多的部分,你就應該以顯而易見的方式繼續進行,直到發現兩個不相等的部分(否則你就應該比較最不重要的部分),這時,你就可以返回比較結果了。 這是 一個建立 Name 對象列表并對它們進行排序的小程序:



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩免费观看高清| 国产精品视频免费在线| 亚洲精品欧美日韩专区| 亚洲精品91美女久久久久久久| 欧美激情xxxx性bbbb| 日韩免费在线播放| 亚洲精品视频中文字幕| 91av在线免费观看视频| 成人字幕网zmw| 日韩精品小视频| 欧美日韩激情美女| 亚洲欧美国产高清va在线播| 欧美日韩成人在线视频| 搡老女人一区二区三区视频tv| 亚洲国产91精品在线观看| 亚洲天堂成人在线| 97精品一区二区视频在线观看| 97超碰色婷婷| xx视频.9999.com| 国产精品国产三级国产aⅴ浪潮| 国产精品高潮视频| 亚洲人在线视频| 日韩美女av在线免费观看| 欧美黄色片免费观看| 97视频在线播放| 精品中文字幕久久久久久| 国产精品99免视看9| 日韩高清中文字幕| 国产日韩欧美一二三区| 午夜免费在线观看精品视频| 国产精品女主播视频| 亚洲成av人影院在线观看| 欧美日韩精品国产| 日韩中文字幕精品| 亚洲高清福利视频| 国产视频精品在线| 亚洲午夜未删减在线观看| 亚洲男人天堂网| 欧美中在线观看| 精品亚洲夜色av98在线观看| 亚洲最大中文字幕| 国产精品福利久久久| 欧美丝袜一区二区三区| 国产亚洲精品久久久久久牛牛| 98午夜经典影视| 91tv亚洲精品香蕉国产一区7ujn| 97精品国产aⅴ7777| 久久久91精品国产一区不卡| 亚洲jizzjizz日本少妇| 精品一区精品二区| 亚洲国产精彩中文乱码av在线播放| 国产精品老女人精品视频| 国产精品99久久久久久久久| 成人国内精品久久久久一区| 色综合久久精品亚洲国产| 538国产精品一区二区免费视频| 久久人人97超碰精品888| 一区二区三区动漫| 久久精品99久久久久久久久| 国产欧美日韩最新| 久久久精品中文字幕| 欧美大片大片在线播放| 国产成人极品视频| 国外成人在线播放| 91亚洲精华国产精华| 日韩av一区在线| 色偷偷88888欧美精品久久久| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲国产美女久久久久| 国产日产欧美a一级在线| 久久久最新网址| 亚洲女人天堂网| 91国内在线视频| 亚洲三级黄色在线观看| 亚洲iv一区二区三区| 久久精品这里热有精品| 亚洲人成网在线播放| 成人福利网站在线观看| 欧美做受高潮1| 欧美日韩黄色大片| 亚洲一区二区三区在线免费观看| 国产精品欧美日韩久久| 国产精品久久久| 亚洲男人天堂网站| 亚洲成人网久久久| 国产精品久久久久影院日本| 丝袜情趣国产精品| 欧美色另类天堂2015| 亚洲精品中文字| 欧美乱大交做爰xxxⅹ性3| 久久久久久av| 正在播放欧美一区| 亚洲综合精品一区二区| 九九精品在线视频| 久久久久国产精品免费| 海角国产乱辈乱精品视频| 精品国模在线视频| 国产欧美日韩亚洲精品| 九九精品视频在线观看| 久久久久久免费精品| 亚洲欧洲xxxx| 久久久久久国产三级电影| 国产成人高清激情视频在线观看| 欧美激情视频在线免费观看 欧美视频免费一| 国产精品美女主播在线观看纯欲| 久久在线免费观看视频| 日韩精品高清在线| 日韩在线免费观看视频| 中文字幕无线精品亚洲乱码一区| 在线视频国产日韩| 中文字幕免费精品一区高清| 日韩人体视频一二区| 国产成人精品一区二区在线| 欧美高清视频在线| 欧美精品国产精品日韩精品| 国产精品美女网站| 国产精品九九久久久久久久| 欧美激情va永久在线播放| 欧洲美女7788成人免费视频| 中文字幕亚洲色图| 久久综合电影一区| 成人xvideos免费视频| 欧美高清在线视频观看不卡| 92版电视剧仙鹤神针在线观看| 富二代精品短视频| 欧美性xxxx极品高清hd直播| 亚洲欧美日韩综合| 成人网址在线观看| 成人欧美一区二区三区在线| 日韩一区二区av| 色偷偷噜噜噜亚洲男人| 久久久久久久久电影| 国产成人激情视频| 国内精品伊人久久| 国产热re99久久6国产精品| 欧美性生活大片免费观看网址| 91情侣偷在线精品国产| 国产精品一区久久| 黑人巨大精品欧美一区二区一视频| 日韩欧美极品在线观看| 在线观看日韩www视频免费| 国精产品一区一区三区有限在线| 国产91在线播放九色快色| 久久噜噜噜精品国产亚洲综合| 亚洲一区二区三区在线免费观看| 欧美交受高潮1| 91精品美女在线| 久久理论片午夜琪琪电影网| 亚洲成人精品视频在线观看| 久久免费观看视频| 久久人体大胆视频| 国产成人亚洲精品| 成人免费福利视频| 久久精品中文字幕一区| 欧美日韩精品在线视频| 欧美日韩成人在线播放| 精品久久久久久久久久久| 欧美性资源免费| 国产精品免费观看在线| 成人欧美一区二区三区黑人孕妇| 精品精品国产国产自在线| 国产日韩欧美在线播放| 中文字幕少妇一区二区三区| 国产欧美日韩中文字幕|