[Java] 將Map按Key(主鍵/關(guān)鍵字)或Value(值)排序

?在書寫程序的過程中滥朱,常常需要對map的key或者value進(jìn)行排序鞍历,Java本身沒有提供對map排序的方法乌询,下面的代碼展示如何手動對map進(jìn)行排序

1呀打、按Key排序

jdk內(nèi)置的java.util包的TreeMap<K,V>可以實現(xiàn)對Key的排序矢赁,通過構(gòu)造方法中傳入比較器Comparator即可實現(xiàn),這里Comparator類型輸入的泛型參數(shù)是K的超類或本身贬丛,即TreeMap(Comparator<? super K> comparator)

相關(guān)代碼

public class MapSortDemo {

    public static void main(String[] args) {

        Map<String, String> map = new TreeMap<String, String>();

        map.put("KFC", "kfc");
        map.put("WNBA", "wnba");
        map.put("NBA", "nba");
        map.put("CBA", "cba");

        Map<String, String> resultMap = sortMapByKey(map);    //按Key進(jìn)行排序

        for (Map.Entry<String, String> entry : resultMap.entrySet()) {
            System.out.println(entry.getKey() + " " + entry.getValue());
        }
    }
    
    /**
     * 使用 Map按key進(jìn)行排序
     * @param map
     * @return
     */
    public static Map<String, String> sortMapByKey(Map<String, String> map) {
        if (map == null || map.isEmpty()) {
            return null;
        }

        Map<String, String> sortMap = new TreeMap<String, String>(
                new MapKeyComparator());

        sortMap.putAll(map);

        return sortMap;
    }
}


比較器類

class MapKeyComparator implements Comparator<String>{

    @Override
    public int compare(String str1, String str2) {
        
        return str1.compareTo(str2);
    }
}

2撩银、按Value排序

在很多場景下,需要對value排序豺憔,Java無法直接實現(xiàn)對map的value的排序额获,因此需要借助其他數(shù)據(jù)結(jié)構(gòu)來進(jìn)行排序够庙。這里使用Collectionssort方法,將map轉(zhuǎn)化為list結(jié)構(gòu)抄邀,對list進(jìn)行排序耘眨,之后在把list中數(shù)據(jù)裝回map,達(dá)到排序目的境肾。在裝回map過程中剔难,使用LinkedHashMap保證裝回的順序與list一致。

例如奥喻,我們需要對一些多個圓形軌道上物體的位置進(jìn)行排序偶宫,每個物體都有一個位置屬性,位置包含所處的軌道和物體的初始角度环鲤,現(xiàn)在要求只按照初始角度進(jìn)行從小到大的排序纯趋。

代碼如下

/**
 * poisiton是一個map,保存每個物體對應(yīng)的位置
 */
Map<E, Position> sortedMap = new LinkedHashMap<E, Position>();
            List<Map.Entry<E, Position>> entryList = new ArrayList<Map.Entry<E, Position>>(position.entrySet()); //先轉(zhuǎn)為entrySet冷离,在轉(zhuǎn)為List
            Collections.sort(entryList, new MapValueComparator<E>());

            Iterator<Entry<E, Position>> iter = entryList.iterator();
            Map.Entry<E, Position> tmpEntry = null;
            while (iter.hasNext()) {
                tmpEntry = iter.next();
                sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue()); //add sorted object in map
            }

/**
 * 比較器類
 * 根據(jù)軌道物體對象的初始角度對position映射進(jìn)行升序排序
 *
 * @param <E> 軌道物體類型
 */
class MapValueComparator<E> implements Comparator<Map.Entry<E, Position>> {

    @Override
    public int compare(Entry<E, Position> o1, Entry<E, Position> o2) {
        double a1 = o1.getValue().getAngle();
        double a2 = o2.getValue().getAngle();
        /*
         * compare函數(shù)返回的數(shù)值正負(fù)遵循規(guī)則:
         *      compare(a,b)
         *      一切以升序排列吵冒,如果 a 與 b 比較返回正數(shù),說明a應(yīng)該排在b后面酒朵,即a比b大
         *                   如果 a b比較返回負(fù)數(shù)桦锄,說明a小于b,a排在b前面
         */
        if(a1 > a2) return 1; //a1角度大于a2蔫耽,返回正數(shù)
        else if(a1 < a2) return -1;
        if(Math.abs(a1 - a2) < 1e-10) return 0;
        return 0;
    }
}

這里的代碼說明如果value是一個類,那么可以針對類中某一個具體屬性進(jìn)行排序留夜,也可綜合考慮多個屬性進(jìn)行排序匙铡。


參考文章

? Java Map 按Key排序和按Value排序

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市碍粥,隨后出現(xiàn)的幾起案子鳖眼,更是在濱河造成了極大的恐慌,老刑警劉巖嚼摩,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钦讳,死亡現(xiàn)場離奇詭異,居然都是意外死亡枕面,警方通過查閱死者的電腦和手機愿卒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來潮秘,“玉大人琼开,你說我怎么就攤上這事≌碥瘢” “怎么了柜候?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵搞动,是天一觀的道長。 經(jīng)常有香客問我渣刷,道長鹦肿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任辅柴,我火速辦了婚禮箩溃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘碌识。我一直安慰自己碾篡,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布筏餐。 她就那樣靜靜地躺著开泽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪魁瞪。 梳的紋絲不亂的頭發(fā)上穆律,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音导俘,去河邊找鬼峦耘。 笑死,一個胖子當(dāng)著我的面吹牛旅薄,可吹牛的內(nèi)容都是我干的辅髓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼少梁,長吁一口氣:“原來是場噩夢啊……” “哼洛口!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起凯沪,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤第焰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后妨马,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挺举,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年烘跺,在試婚紗的時候發(fā)現(xiàn)自己被綠了湘纵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡液荸,死狀恐怖瞻佛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤伤柄,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布绊困,位于F島的核電站,受9級特大地震影響适刀,放射性物質(zhì)發(fā)生泄漏秤朗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一笔喉、第九天 我趴在偏房一處隱蔽的房頂上張望取视。 院中可真熱鬧,春花似錦常挚、人聲如沸作谭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽折欠。三九已至,卻和暖如春吼过,著一層夾襖步出監(jiān)牢的瞬間锐秦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工盗忱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留酱床,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓趟佃,卻偏偏與公主長得像扇谣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子闲昭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

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

  • Java集合類可用于存儲數(shù)量不等的對象,并可以實現(xiàn)常用的數(shù)據(jù)結(jié)構(gòu)如棧,隊列等,Java集合還可以用于保存具有映射關(guān)...
    小徐andorid閱讀 1,918評論 0 13
  • 一汤纸、基本數(shù)據(jù)類型 注釋 單行注釋:// 區(qū)域注釋:/* */ 文檔注釋:/** */ 數(shù)值 對于byte類型而言...
    龍貓小爺閱讀 4,254評論 0 16
  • title: Java Map 按key排序和按Value排序date: 2016/8/31 15:24:13ta...
    Skye_kh閱讀 66,299評論 1 9
  • 在一個方法內(nèi)部定義的變量都存儲在棧中,當(dāng)這個函數(shù)運行結(jié)束后芹血,其對應(yīng)的棧就會被回收贮泞,此時,在其方法體中定義的變量將不...
    Y了個J閱讀 4,413評論 1 14
  • 1.Java集合框架是什么幔烛?說出一些集合框架的優(yōu)點啃擦? 每種編程語言中都有集合,最初的Java版本包含幾種集合類:V...
    Oneisall_81a5閱讀 898評論 0 11