java如何對map進(jìn)行排序詳解(map集合的使用)

一、簡單介紹Map

在講解Map排序之前被冒,我們先來稍微了解下map。map是鍵值對的集合接口漾根,它的實(shí)現(xiàn)類主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。其中這四者的區(qū)別如下(簡單介紹):

HashMap:我們最常用的Map猴仑,它根據(jù)key的HashCode 值來存儲(chǔ)數(shù)據(jù),根據(jù)key可以直接獲取它的Value棒口,同時(shí)它具有很快的訪問速度瓤鼻。HashMap最多只允許一條記錄的key值為Null(多條會(huì)覆蓋);允許多條記錄的Value為 Null保屯。非同步的手负。

TreeMap:能夠把它保存的記錄根據(jù)key排序,默認(rèn)是按升序排序,也可以指定排序的比較器姑尺,當(dāng)用Iterator 遍歷TreeMap時(shí)竟终,得到的記錄是排過序的。TreeMap不允許key的值為null切蟋。非同步的统捶。

Hashtable:與HashMap類似,不同的是:key和value的值均不允許為null;它支持線程的同步,即任一時(shí)刻只有一個(gè)線程能寫Hashtable,因此也導(dǎo)致了Hashtale在寫入時(shí)會(huì)比較慢。

LinkedHashMap:保存了記錄的插入順序喘鸟,在用Iterator遍歷LinkedHashMap時(shí)匆绣,先得到的記錄肯定是先插入的.在遍歷的時(shí)候會(huì)比HashMap慢。key和value均允許為空迷守,非同步的犬绒。

二旺入、Map排序

TreeMap

TreeMap默認(rèn)是升序的兑凿,如果我們需要改變排序方式,則需要使用比較器:Comparator茵瘾。

Comparator可以對集合對象或者數(shù)組進(jìn)行排序的比較器接口礼华,實(shí)現(xiàn)該接口的public compare(T o1,To2)方法即可實(shí)現(xiàn)排序,該方法主要是根據(jù)第一個(gè)參數(shù)o1,小于拗秘、等于或者大于o2分別返回負(fù)整數(shù)圣絮、0或者正整數(shù)。代碼如下:

public class TreeMapTest {
    public static void main(String[] args) {
        Map<String, String> map = new TreeMap<String, String>(
                new Comparator<String>() {
                    public int compare(String obj1, String obj2) {
                        // 降序排序
                        return obj2.compareTo(obj1);
                    }
                });
        map.put("c", "ccccc");
        map.put("a", "aaaaa");
        map.put("b", "bbbbb");
        map.put("d", "ddddd");

        Set<String> keySet = map.keySet();
        Iterator<String> iter = keySet.iterator();
        while (iter.hasNext()) {
            String key = iter.next();
            System.out.println(key + ":" + map.get(key));
        }
    }
}

運(yùn)行結(jié)果如下:
d:ddddd
c:ccccc
b:bbbbb
a:aaaaa

上面例子是對根據(jù)TreeMap的key值來進(jìn)行排序的雕旨,但是有時(shí)我們需要根據(jù)TreeMap的value來進(jìn)行排序扮匠。對value排序我們就需要 借助于Collections的sort(List<T> list, Comparator<? super T> c)方法,該方法根據(jù)指定比較器產(chǎn)生的順序?qū)χ付斜磉M(jìn)行排序凡涩。但是有一個(gè)前提條件棒搜,那就是所有的元素都必須能夠根據(jù)所提供的比較器來進(jìn)行比較。如下:

public class TreeMapTest {
    public static void main(String[] args) {
        Map<String, String> map = new TreeMap<String, String>();
        map.put("d", "ddddd");
        map.put("b", "bbbbb");
        map.put("a", "aaaaa");
        map.put("c", "ccccc");

        //這里將map.entrySet()轉(zhuǎn)換成list
        List<Map.Entry<String,String>> list = new ArrayList<Map.Entry<String,String>>(map.entrySet());
        //然后通過比較器來實(shí)現(xiàn)排序
        Collections.sort(list,new Comparator<Map.Entry<String,String>>() {
            //升序排序
            public int compare(Entry<String, String> o1,
                    Entry<String, String> o2) {
                return o1.getValue().compareTo(o2.getValue());
            }
        });
        for(Map.Entry<String,String> mapping:list){                System.out.println(mapping.getKey()+":"+mapping.getValue()); 
          } 
    }
}

運(yùn)行結(jié)果如下:
d:ddddd
c:ccccc
b:bbbbb
a:aaaaa

HashMap

我們都是HashMap的值是沒有順序的活箕,他是按照key的HashCode來實(shí)現(xiàn)的力麸。對于這個(gè)無序的HashMap我們要怎么來實(shí)現(xiàn)排序呢?參照TreeMap的value排序育韩,我們一樣的也可以實(shí)現(xiàn)HashMap的排序克蚂。

public class HashMapTest {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<String, String>();
        map.put("c", "ccccc");
        map.put("a", "aaaaa");
        map.put("b", "bbbbb");
        map.put("d", "ddddd");

        List<Map.Entry<String,String>> list = new ArrayList<Map.Entry<String,String>>(map.entrySet());
        Collections.sort(list,new Comparator<Map.Entry<String,String>>() {
            //升序排序
            public int compare(Entry<String, String> o1,
                    Entry<String, String> o2) {
                return o1.getValue().compareTo(o2.getValue());
            }

        });

        for(Map.Entry<String,String> mapping:list){ 
               System.out.println(mapping.getKey()+":"+mapping.getValue()); 
          } 
     }
}

運(yùn)行結(jié)果如下:
d:ddddd
c:ccccc
b:bbbbb
a:aaaaa

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市筋讨,隨后出現(xiàn)的幾起案子埃叭,更是在濱河造成了極大的恐慌,老刑警劉巖悉罕,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赤屋,死亡現(xiàn)場離奇詭異,居然都是意外死亡蛮粮,警方通過查閱死者的電腦和手機(jī)益缎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來然想,“玉大人莺奔,你說我怎么就攤上這事。” “怎么了令哟?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵恼琼,是天一觀的道長。 經(jīng)常有香客問我屏富,道長晴竞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任狠半,我火速辦了婚禮噩死,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘神年。我一直安慰自己已维,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布已日。 她就那樣靜靜地躺著垛耳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪飘千。 梳的紋絲不亂的頭發(fā)上堂鲜,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機(jī)與錄音护奈,去河邊找鬼缔莲。 笑死,一個(gè)胖子當(dāng)著我的面吹牛逆济,可吹牛的內(nèi)容都是我干的酌予。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼奖慌,長吁一口氣:“原來是場噩夢啊……” “哼抛虫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起简僧,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤建椰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后岛马,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棉姐,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年啦逆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伞矩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡夏志,死狀恐怖乃坤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤湿诊,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布狱杰,位于F島的核電站,受9級特大地震影響厅须,放射性物質(zhì)發(fā)生泄漏仿畸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一朗和、第九天 我趴在偏房一處隱蔽的房頂上張望错沽。 院中可真熱鬧,春花似錦例隆、人聲如沸甥捺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至皿曲,卻和暖如春唱逢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屋休。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工坞古, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人劫樟。 一個(gè)月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓痪枫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親叠艳。 傳聞我的和親對象是個(gè)殘疾皇子奶陈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 感恩今天是10月的最后一天,這一生將永不再有的時(shí)刻附较!感恩當(dāng)下的平和吃粒! 感恩我生命中度過的這一段時(shí)光,讓我成長和感悟...
    A曼均閱讀 223評論 0 0
  • 背景 在做項(xiàng)目時(shí)拒课,顯示引導(dǎo)頁時(shí)候有個(gè)動(dòng)畫需求徐勃。 實(shí)現(xiàn)一個(gè)View放大的效果 可以提前結(jié)束動(dòng)畫,下次喚起引導(dǎo)頁面又重...
    宇是我閱讀 21,242評論 1 4
  • 文 / 藝文小舍 一朵蒲公英 渴望柔柔的風(fēng)來 渴望在風(fēng)中 展示她的輕盈 一片白云 渴望高遠(yuǎn)的風(fēng)來 渴望在風(fēng)中 暢游...
    藝文小舍閱讀 168評論 4 16