天天看点

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());
        }