• 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;  
        }
  • 相关阅读:
    ADO数据库操作
    AfxMessageBox和MessageBox区别
    Qt — 子窗体操作父窗体中的方法
    Qt — tableWidget插入复选框
    Qt & MySQL
    windows下安装Qt
    Extjs — Grid数据导出成Excel
    Mac终端 vi/vim 的简单使用
    iOS开发CocoaPods使用说明
    Shell 脚本学习笔记十:Shell输入输出重定向
  • 原文地址:https://www.cnblogs.com/zrbfree/p/5707592.html
Copyright © 2020-2023  润新知