java 有序Map之TreeMap的使用

謙虛使人進(jìn)步

想要了解一個(gè)類,就可以從它實(shí)現(xiàn)的接口和繼承的父類開(kāi)始。我們可以看到TreeMap實(shí)現(xiàn)了java.util.NavigableMap接口锣枝,NavigableMap它又繼承了排序Map接口 java.util.SortedMap,因此TreeMap具有排序能力;其次零远,TreeMap實(shí)現(xiàn)了Cloneable和Serializable接口,它也具備克隆和序列化能力

image.png

TreeMap底層由紅黑樹實(shí)現(xiàn)厌蔽,按照Key的自然順序升序或者實(shí)現(xiàn)Comprator接口進(jìn)行自定義排序牵辣。且TreeMap的排序特性只作用在key上。如果需要value也跟著排序就需要使用一些別的手段奴饮。

排序特性

按key排序

默認(rèn)按key升序排列

package com.springboot.study.demo1;
import java.util.*;

public class Test {
    public static void main(String[] args) {

        TreeMap<String, String> treeMap = new TreeMap<String, String>() {{
            put("3", "1");
            put("1", "3");
            put("2", "2");

        }};

        for (String s : treeMap.keySet()) {
            System.out.println(s+"==>"+treeMap.get(s));
        }

    }
}
image.png

按key降序排列

package com.springboot.study.demo1;

import java.util.*;

public class Test {
    public static void main(String[] args) {

        TreeMap<String, String> treeMap = new TreeMap<String, String>(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o2.compareTo(o1);
            }
        }) {{
            put("3", "1");
            put("1", "2");
            put("2", "3");

        }};

        for (String s : treeMap.keySet()) {
            System.out.println(s + "==>" + treeMap.get(s));
        }

    }
}
image.png
按value排序

如果需要value也跟著排序就需要使用一些別的手段纬向。當(dāng)然HashMap的value排序也可以使用這種方法

將Map轉(zhuǎn)為 List<Map.Entry>,然后使用java.util.Collections工具類來(lái)排序戴卜。當(dāng)然這種方法也適用于HashMap

package com.springboot.study.demo1;

import java.util.*;
import java.util.stream.Collectors;

public class Test {
    public static void main(String[] args) {
        Map<String, String> treeMap = new HashMap<String, String>() {{
            put("3", "1");
            put("1", "2");
            put("2", "3");

        }};

        //將Map轉(zhuǎn)為 List<Map.Entry>
        List<Map.Entry<String, String>> list = new ArrayList<>(treeMap.entrySet());
        //按照
        Collections.sort(list,new Comparator<Map.Entry<String,String>>() {
            //升序排序
            public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {
                return o1.getValue().compareTo(o2.getValue());
            }
        });


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

    }
}
image.png

性能特性

  • TreeMap的優(yōu)勢(shì)在于能夠?qū)崿F(xiàn)自定義排序功能逾条,但是性能要比HashMap和LinkedHashMap差。它的 containsKey 投剥、get 师脂、 put 、remove 方法的時(shí)間復(fù)雜度是 log(n)

  • 雖然LinkedHashMap也是有序的,但是LinkedHashMap內(nèi)元素順序只和插入順序有關(guān)危彩,無(wú)法進(jìn)行自定義排序

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末攒磨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子汤徽,更是在濱河造成了極大的恐慌娩缰,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谒府,死亡現(xiàn)場(chǎng)離奇詭異拼坎,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)完疫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門泰鸡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人壳鹤,你說(shuō)我怎么就攤上這事盛龄。” “怎么了芳誓?”我有些...
    開(kāi)封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵余舶,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我锹淌,道長(zhǎng)匿值,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任赂摆,我火速辦了婚禮挟憔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘烟号。我一直安慰自己绊谭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布汪拥。 她就那樣靜靜地躺著龙誊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪喷楣。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天鹤树,我揣著相機(jī)與錄音铣焊,去河邊找鬼。 笑死罕伯,一個(gè)胖子當(dāng)著我的面吹牛曲伊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼坟募,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼岛蚤!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起懈糯,我...
    開(kāi)封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤涤妒,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后赚哗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體她紫,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年屿储,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贿讹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡够掠,死狀恐怖民褂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情疯潭,我是刑警寧澤赊堪,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站袁勺,受9級(jí)特大地震影響雹食,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜期丰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一群叶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钝荡,春花似錦街立、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至端辱,卻和暖如春梁剔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背舞蔽。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工荣病, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人渗柿。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓个盆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子颊亮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

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

  • 集合類框架的介紹: ![Java 集合類框架](https://upload-images.jianshu.io/...
    LynnGuo閱讀 753評(píng)論 0 1
  • Java集合類可用于存儲(chǔ)數(shù)量不等的對(duì)象,并可以實(shí)現(xiàn)常用的數(shù)據(jù)結(jié)構(gòu)如棧,隊(duì)列等,Java集合還可以用于保存具有映射關(guān)...
    小徐andorid閱讀 1,925評(píng)論 0 13
  • 原文地址 Java集合 Java集合框架:是一種工具類柴梆,就像是一個(gè)容器可以存儲(chǔ)任意數(shù)量的具有共同屬性的對(duì)象。 Ja...
    gyl_coder閱讀 978評(píng)論 0 8
  • 摘要 HashMap是Java程序員使用頻率最高的用于映射(鍵值對(duì))處理的數(shù)據(jù)類型终惑。隨著JDK(Java Deve...
    周二倩你一生閱讀 1,246評(píng)論 0 5
  • 本文轉(zhuǎn)自 https://zhuanlan.zhihu.com/p/21673805 美團(tuán)點(diǎn)評(píng)技術(shù)團(tuán)隊(duì)· 3 個(gè)月...
    抓兔子的貓閱讀 1,056評(píng)論 0 1