天天看點

Map集合之TreeMap

在無聊的一天中,有一個以前的同學面試,回來後問我如何講bac放進一個map集合key中,取出來是abc

當時在中午飯,後來回公司就網上查了一下,一般會使用Treemap進行存儲,因為Treemap會自動對key值進行排序,如:

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

map.put("b","b");

map.put("a","a");

map.put("c","c");

for(Map.Entry<String,String> item : map.entrySet()){

System.out.println(item.getKey()+"\t"+item.getValue());

}

結果:

a    a

b    b

c    c

但是要對Value進行排序的話,就要接口Comparator接口實作其方法,代碼如下:

package com.example;
/*
.......................阿彌陀佛......................
.                       _oo0oo_                      .
.                      o8888888o                     .
.                      88" . "88                     .
.                      (| -_- |)                     .
.                      0\  =  /0                     .
.                   ___/‘---’\___                   .
.                  .' \|       |/ '.                 .
.                 / \\|||  :  |||// \                .
.                / _||||| -卍-|||||_ \               .
.               |   | \\\  -  /// |   |              .
.               | \_|  ''\---/''  |_/ |              .
.               \  .-\__  '-'  ___/-. /              .
.             ___'. .'  /--.--\  '. .'___            .
.         ."" ‘<  ‘.___\_<|>_/___.’>’ "".          .
.       | | :  ‘- \‘.;‘\ _ /’;.’/ - ’ : | |        .
.         \  \ ‘_.   \_ __\ /__ _/   .-’ /  /        .
.    =====‘-.____‘.___ \_____/___.-’___.-’=====     .
.                       ‘=---=’                      .
.                                                    .
.....................佛祖保佑 ,永無BUG..................
*/

import java.util.*;

/**
 * @author 陳毅程  at  2019/5/27 14:52
 * contact by QQ:2446762079
 * contact by 微信:cyc2446762079
 */
public class test5 {

    public static void main(String[] args) {
        Map map1 = new TreeMap();      //定義Map集合對象
        map1.put("apple", "新鮮的蘋果");     //向集合中添加對象
        map1.put("compr", "配置優良的計算機");
        map1.put("book", "堆積成山的圖書");
        map1.put("hook", "堆積成山的圖書");
        map1.put("dook", "堆積成山的圖書");
        Map<String,String> map = Compar(map1);
        for(Map.Entry<String,String> item : map.entrySet()){
            System.out.println(item.getKey()+"\t"+item.getValue());
        }
    }


    public static Map<String,String> Compar(Map<String,String> map){
        if (map.isEmpty() || map == null)
            return null;
        Map<String,String> LinketHashMap = new LinkedHashMap<>();
        List<Map.Entry<String,String>> listMap = new ArrayList<>( map.entrySet());
        Collections.sort(listMap,new MapKeyComparator());
        Iterator<Map.Entry<String,String>> iterator = listMap.iterator();
        Map.Entry<String,String> map1 = null;
        while (iterator.hasNext()){
            map1 = iterator.next();
            LinketHashMap.put(map1.getKey(),map1.getValue());
        }
        return LinketHashMap;
    }


}
class MapKeyComparator implements Comparator<Map.Entry<String,String>>{

    @Override
    public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {
//        排序的方法,倒序Key值排序
//        如果想進行正序,o1.getKey().compareTo(o2.getKey());
        return o2.getKey().compareTo(o1.getKey());
    }
}
           

結果:

hook    堆積成山的圖書

dook    堆積成山的圖書

compr    配置優良的計算機

book    堆積成山的圖書

apple    新鮮的蘋果

在檢視網上說法的時候有一篇文章說到一個小問題,就是當key為String類型的int的時候,排序會出現如下:

put(“1”,“1”)

put(“2”,“2”)

put(“10”,“10”)

結果為:

1 1

10 10

2 2

這個時候把int更換為long類型就可以了

Map<Integer, String> map = new TreeMap<Integer, String>();
        map.put(4, "ddddd");
        map.put(7, "bbbbb");
        map.put(10, "aaaaa");
        map.put(1, "ccccc");

        List<Map.Entry<Integer,String>> list = new ArrayList<Map.Entry<Integer,String>>(map.entrySet());

        Collections.sort(list, new Comparator<Map.Entry<Integer, String>>() {
            @Override
            public int compare(Map.Entry<Integer, String> o1, Map.Entry<Integer, String> o2) {
                return o2.getKey().compareTo(o1.getKey());
            }
        });

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