Map根据value排序ASC DESC

Posted 起个名字好难

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
    }

 

 

以上是关于Map根据value排序ASC DESC的主要内容,如果未能解决你的问题,请参考以下文章

如何根据值列表对字典进行排序

Mongoid Rails 4 按 asc 或 desc order created_at 排序

mysql中order by 排序用asc和desc不起作用怎么回事

SQL里面的排序语句desc和ASC有啥区别

#yyds干货盘点# 07 MySQL数据排序

使用datatables 中文排序