zoukankan      html  css  js  c++  java
  • 160725、Java Map按键排序和按值排序

    按键排序(sort by key)

    jdk内置的Java.util包下的TreeMap<K,V>既可满足此类需求,原理很简单,其重载的构造器之一

    有一个参数,该参数接受一个比较器,比较器定义比较规则,比较规则就是作用于TreeMap<K,V>的键,据此可实现按键排序。

    /**
         * TODO: 通过Map的key排序,由小到大排序
         * @Auhor: RICK
         * @Date : 2016年7月26日
         */
        public static Map<String, String> sortMapByKey(Map<String, String> oriMap) {  
            if (oriMap == null || oriMap.isEmpty()) {  
                return null;  
            }  
            Map<String, String> sortedMap = new TreeMap<String, String>(new Comparator<String>() {  
                public int compare(String key1, String key2) {  
                    int intKey1 = 0, intKey2 = 0;  
                    try {  
                        intKey1 = getInt(key1);  
                        intKey2 = getInt(key2);  
                    } catch (Exception e) {  
                        intKey1 = 0;   
                        intKey2 = 0;  
                    }  
                    return intKey1 - intKey2;  
                }});  
            sortedMap.putAll(oriMap);  
            return sortedMap;  
        }  
          
        /**
         * TODO: 把字符串转换成数字
         * @Auhor: RICK
         * @Date : 2016年7月26日
         */
        private static int getInt(String str) {  
            int i = 0;  
            try {  
                Pattern p = Pattern.compile("^\d+");  
                Matcher m = p.matcher(str);  
                if (m.find()) {  
                    i = Integer.valueOf(m.group());  
                }  
            } catch (NumberFormatException e) {  
                e.printStackTrace();  
            }  
            return i;  
        } 

    按值排序(sort by value)

    按值排序就相对麻烦些了,貌似没有直接可用的数据结构能处理类似需求,需要我们自己转换一下。

    Map本身按值排序是很有意义的,很多场合下都会遇到类似需求,可以认为其值是定义的某种规则或者权重。

    /**
         * TODO: 通过Map的Value排序,由小到大排序
         * @Auhor: RICK
         * @Date : 2016年7月26日
         */
        public static Map<String, String> sortMapByValue(Map<String, String> oriMap) {  
            Map<String, String> sortedMap = new LinkedHashMap<String, String>();  
            if (oriMap != null && !oriMap.isEmpty()) {  
                List<Map.Entry<String, String>> entryList = new ArrayList<Map.Entry<String, String>>(oriMap.entrySet());  
                Collections.sort(entryList,  
                        new Comparator<Map.Entry<String, String>>() {  
                            public int compare(Entry<String, String> entry1,  
                                    Entry<String, String> entry2) {  
                                int value1 = 0, value2 = 0;  
                                try {  
                                    value1 = getInt(entry1.getValue());  
                                    value2 = getInt(entry2.getValue());  
                                } catch (NumberFormatException e) {  
                                    value1 = 0;  
                                    value2 = 0;  
                                }  
                                return value1 - value2;  
                            }  
                        });  
                Iterator<Map.Entry<String, String>> iter = entryList.iterator();  
                Map.Entry<String, String> tmpEntry = null;  
                while (iter.hasNext()) {  
                    tmpEntry = iter.next();  
                    sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue());  
                }  
            }  
            return sortedMap;  
        }  
    
        
        /**
         * TODO: 把字符串转换成数字
         * @Auhor: RICK
         * @Date : 2016年7月26日
         */
        private static int getInt(String str) {  
            int i = 0;  
            try {  
                Pattern p = Pattern.compile("^\d+");  
                Matcher m = p.matcher(str);  
                if (m.find()) {  
                    i = Integer.valueOf(m.group());  
                }  
            } catch (NumberFormatException e) {  
                e.printStackTrace();  
            }  
            return i;  
        }
  • 相关阅读:
    洛谷 P1084 [NOIP2012 提高组] 疫情控制(二分,倍增,贪心)
    洛谷 P2680 [NOIP2015 提高组] 运输计划(二分,树上查分,树上倍增,LCA)
    洛谷 P6858 深海少女与胖头鱼(期望dp)
    洛谷 P2197 【模板】nim 游戏(博弈论)
    洛谷 P1297 [国家集训队]单选错位(期望)
    洛谷 P1288 取数游戏II(博弈论)
    洛谷 P4316 绿豆蛙的归宿(期望)
    P1495 【模板】中国剩余定理(CRT)/曹冲养猪
    【模板】快速乘
    [数论学习笔记]费马小定理、欧拉函数、欧拉定理、欧拉降幂公式
  • 原文地址:https://www.cnblogs.com/zrbfree/p/5707592.html
Copyright © 2011-2022 走看看