• 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;
        }
     
  • 相关阅读:
    LUA 协程
    LUA GC 简单测试
    软件重构-笔记
    托管执行过程
    文件夹 加密
    db 文件 查看 打开 工具 db 中文 版 navicat 中文
    qq sid qq sid 是什么 qq sid 怎么用
    windows系统,联系人文件。个性化。
    csdn 音乐 怎么拦截 提交后的程序 csdn 栏目 音乐 csdn 添加 音乐
    CSDN博客栏目设置个性化
  • 原文地址:https://www.cnblogs.com/shihaiming/p/6978556.html
Copyright © 2020-2023  润新知