• Map根据value排序ASC DESC


    原文:http://blog.csdn.net/k21325/article/details/53259180

    需求有点刁钻,写关键词组合匹配标题的时候,遇到关键词像这样

    XXX XXX 1222
    XXX XXX 222
    XXX XXX 22
    XXX XXX 22
    XXX XXX 11
    XXX XXX 1
    XXX XXX 1

    前面的XXX 代表关键词,两两组合,后面的数字代表优先级,优先级高的优先匹配

    那么问题来了,每匹配到一个词组,要提取出来,作为新的匹配词组表,这个步骤就肯定了顺序是乱的,且有重复,

    通过Set去重之后,我们的需求是这样,要按照后面的优先级排序,优先级高的在前面

    这时候我就想到了要用Map放Key Value,问题就在这,key不能放优先级的数字,因为有重复值,而整条匹配词组是没有重复值的,so,map值就编程了这样

    ["XXX XXX 1222":1222,"XXX XXX 222":222,...]  

    重点就在这了,根据map的value值给map排序

    /**
         * HashSet <"XX XX 123"> 根据123排序
         * @param hashSet 
         * @param sort 排序方式 "ASC","DESC"
         * @return 排序好的List
         */
        private List<String> sortHashSet2List(HashSet<String> hashSet, String sort){
            Map<String, Integer> map = new HashMap<String, Integer>();
            for (String keyword : hashSet) {
                Integer i = keyword.lastIndexOf(" ")+1;
                Integer l = keyword.length();
                String o = keyword.substring(i,l);
                Integer a = Integer.valueOf(o);
                map.put(keyword, a);
            }
            map = sortByValue(map, sort);
            List<String> list = new ArrayList<String>();
            for(Entry<String, Integer> entry:map.entrySet()){    
                list.add(entry.getKey());
            }   
            return list;
        }
        /**
         * HashMap按值进行排序
         * @param map Map<String,Integer>
         * @param sort 排序 ASC正序/DESC倒序
         * @return map <String,Integer>
         */
        private static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map,String sort) {
            
            List<Map.Entry<K, V>> list = new LinkedList<Map.Entry<K, V>>(map.entrySet());
            Collections.sort(list, new Comparator<Map.Entry<K, V>>() {
                public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) {
                    return (o1.getValue()).compareTo(o2.getValue());
                }
            });
            Map<K, V> result = new LinkedHashMap<K, V>();
            if("ASC".equals(sort)){
                for (int i = list.size()-1; i >=0; i--) {
                    result.put(list.get(i).getKey(), list.get(i).getValue());
                }
            }
            if("DESC".equals(sort)){
                for (Map.Entry<K, V> entry : list) {
                    result.put(entry.getKey(), entry.getValue());
                }
            }
            return result;
        }
     
  • 相关阅读:
    c#发送邮件.net1.1和.net2.0中的两个方法
    六步使用ICallbackEventHandler实现无刷新回调
    报表项目总结
    转载:Tomcat Port 8009 与AJP13协议
    JUnit4 使用指南二 (熟练掌握)
    JUnit4 使用指南一 (简单上手)
    HP的项目中曾做一个业务日志系统
    Unitils使用(转载)
    iBatis 学习
    JUnit4 使用指南三 (Runner 特性分析)
  • 原文地址:https://www.cnblogs.com/shihaiming/p/6978556.html
Copyright © 2020-2023  润新知