zoukankan      html  css  js  c++  java
  • Java Map按键(Key)排序和按值(Value)排序

    Map排序的方式有很多种,两种比较常用的方式:按键排序(sort by key), 按值排序(sort by value)。
    1、按键排序
    jdk内置的java.util包下的TreeMap<K,V>既可满足此类需求,向其构造方法 TreeMap(Comparator<? super K> comparator)  传入我们自定义的比较器即可实现按键排序。

    Java代码  收藏代码
    1. public class MapSortDemo {  
    2.     public static void main(String[] args) {  
    3.         Map<String, String> map = new TreeMap<String, String>();  
    4.         map.put("KFC", "kfc");  
    5.         map.put("WNBA", "wnba");  
    6.         map.put("NBA", "nba");  
    7.         map.put("CBA", "cba");  
    8.         Map<String, String> resultMap = sortMapByKey(map);    //按Key进行排序  
    9.         for (Map.Entry<String, String> entry : resultMap.entrySet()) {  
    10.             System.out.println(entry.getKey() + " " + entry.getValue());  
    11.         }  
    12.     }  
    13.       
    14.     /** 
    15.      * 使用 Map按key进行排序 
    16.      * @param map 
    17.      * @return 
    18.      */  
    19.     public static Map<String, String> sortMapByKey(Map<String, String> map) {  
    20.         if (map == null || map.isEmpty()) {  
    21.             return null;  
    22.         }  
    23.         Map<String, String> sortMap = new TreeMap<String, String>(new MapKeyComparator());  
    24.         sortMap.putAll(map);  
    25.         return sortMap;  
    26.     }  
    27. }  
    28.   
    29. //比较器类  
    30. public class MapKeyComparator implements Comparator<String>{  
    31.     public int compare(String str1, String str2) {  
    32.         return str1.compareTo(str2);  
    33.     }  
    34. }  

     2、按值排序
    按值排序就相对麻烦些了,貌似没有直接可用的数据结构能处理类似需求,需要我们自己转换一下。
    Map本身按值排序是很有意义的,很多场合下都会遇到类似需求,可以认为其值是定义的某种规则或者权重。

    原理:将待排序Map中的所有元素置于一个列表中,接着使用Collections的一个静态方法 sort(List<T> list, Comparator<? super T> c) 
    来排序列表,同样是用比较器定义比较规则。排序后的列表中的元素再依次装入Map,为了肯定的保证Map中元素与排序后的List中的元素的顺序一致,使用了LinkedHashMap数据类型。

    Java代码  收藏代码
      1. 实现代码  
      2.   
      3. public class MapSortDemo {  
      4.     public static void main(String[] args) {  
      5.         Map<String, String> map = new TreeMap<String, String>();  
      6.         map.put("KFC", "kfc");  
      7.         map.put("WNBA", "wnba");  
      8.         map.put("NBA", "nba");  
      9.         map.put("CBA", "cba");  
      10.         Map<String, String> resultMap = sortMapByValue(map); //按Value进行排序  
      11.         for (Map.Entry<String, String> entry : resultMap.entrySet()) {  
      12.             System.out.println(entry.getKey() + " " + entry.getValue());  
      13.         }  
      14.     }  
      15.       
      16.     /** 
      17.      * 使用 Map按value进行排序 
      18.      * @param map 
      19.      * @return 
      20.      */  
      21.     public static Map<String, String> sortMapByValue(Map<String, String> map) {  
      22.         if (map == null || map.isEmpty()) {  
      23.             return null;  
      24.         }  
      25.         Map<String, String> sortedMap = new LinkedHashMap<String, String>();  
      26.         List<Map.Entry<String, String>> entryList = new ArrayList<Map.Entry<String, String>>(map.entrySet());  
      27.         Collections.sort(entryList, new MapValueComparator());  
      28.         Iterator<Map.Entry<String, String>> iter = entryList.iterator();  
      29.         Map.Entry<String, String> tmpEntry = null;  
      30.         while (iter.hasNext()) {  
      31.             tmpEntry = iter.next();  
      32.             sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue());  
      33.         }  
      34.         return sortedMap;  
      35.     }  
      36. }  
      37.   
      38. //比较器类  
      39. public class MapValueComparator implements Comparator<Map.Entry<String, String>> {  
      40.     public int compare(Entry<String, String> me1, Entry<String, String> me2) {  
      41.         return me1.getValue().compareTo(me2.getValue());  
      42.     }  
      43. }  
  • 相关阅读:
    深入Android 【一】 —— 序及开篇
    Android中ContentProvider和ContentResolver使用入门
    深入Android 【六】 —— 界面构造
    The service cannot be activated because it does not support ASP.NET compatibility. ASP.NET compatibility is enabled for this application. Turn off ASP.NET compatibility mode in the web.config or add the AspNetCompatibilityRequirements attribute to the ser
    Dynamic Business代码片段总结
    对文件的BuildAction以content,resource两种方式的读取
    paraview 3.12.0 windows下编译成功 小记
    百度网盘PanDownload使用Aria2满速下载
    netdata的安装与使用
    用PS给证件照排版教程
  • 原文地址:https://www.cnblogs.com/yver/p/6009048.html
Copyright © 2011-2022 走看看