欢迎来到站圈网!

php远程媒体七牛node摇摇

投稿中心

Java

当前位置: 主页 > 编程语言 > Java

Map按单个或多个Value排序当Value相同时按Key排序

时间:2023-02-04|作者:向着百万年薪努力的小赵|点击:

Map可以先按照value进行排序,然后按照key进行排序。 或者先按照key进行排序,然后按照value进行排序,这都是可以的。

并且,大家可以制定自己的排序规则。
按单个value排序:

import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
 
import static java.util.Map.Entry.comparingByValue;
import static java.util.stream.Collectors.toMap;
 
public class SortTest {
 
    public static void main(String[] args) throws Exception {
 
        // 创建一个字符串为Key,数字为值的map
        Map budget = new HashMap<>();
        budget.put("clothes", 120);
        budget.put("grocery", 150);
        budget.put("transportation", 100);
        budget.put("utility", 130);
        budget.put("rent", 1150);
        budget.put("miscellneous", 90);
        System.out.println("排序前: " + budget);
 
        // 按值排序 升序
        Map sorted = budget
                .entrySet()
                .stream()
                .sorted(comparingByValue())
                .collect(
                        toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2,
                                LinkedHashMap::new));
 
        System.out.println("升序按值排序后的map: " + sorted);
 
        // 按值排序降序
        sorted = budget
                .entrySet()
                .stream()
                .sorted(Collections.reverseOrder(comparingByValue()))
                .collect(
                        toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2,
                                LinkedHashMap::new));
 
        System.out.println("降序按值排序后的map: " + sorted);
    }
}

按多个value排序:

data = data.stream().sorted(Comparator.comparing(o -> {
    StringBuffer key = new StringBuffer();
    fieldList.stream().forEach((a)-> {
        key.append(o.get(a)+"");
    });
    return key.toString();
} )).collect(Collectors.toList());

下面的代码中,首先按照value的数值从大到小进行排序,当value数值大小相同时,再按照key的长度从长到短进行排序,这个操作与Stream流式操作相结合。

    /**
     * Map按照整数型的value进行降序排序,当value相同时,按照key的长度进行排序
     *
     * @param map
     * @return
     */
    public static LinkedHashMap sortMap(Map map) {
        return map.entrySet().stream().sorted(((item1, item2) -> {
            int compare = item2.getValue().compareTo(item1.getValue());
            if (compare == 0) {
                if (item1.getKey().length() < item2.getKey().length()) {
                    compare = 1;
                } else if (item1.getKey().length() > item2.getKey().length()) {
                    compare = -1;
                }
            }
            return compare;
        })).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
    }

补充:对Map中的Value进行降序排序,当Value相同时,按照Key降序排序

package com.ethjava;
import java.util.*;
public class mappaixu1 {
    public static void main(String[] args){
 
        Map hashMap=new HashMap();
        hashMap.put(1,10);
        hashMap.put(5,7);
        hashMap.put(2,9);
        hashMap.put(3,7);
        hashMap.put(3,6);//key是不可重复的,当这里再次输入Key=3时的,将会覆盖掉前面的(3,7)
        hashMap.put(4,7);
 
        //遍历
        for(Map.Entry e:hashMap.entrySet()){
            System.out.println("Key: "+e.getKey()+"对应的Value: "+e.getValue());
        }
        //Key: 1对应的Value: 10
        //Key: 2对应的Value: 9
        //Key: 3对应的Value: 6
        //Key: 4对应的Value: 7
        //Key: 5对应的Value: 7
        //这里为什么自动按照key升序排序输出???为什么
        // 某梦说,这里是因为凑巧正序输出,hashMap输出相对于输入是无序的。
 
        //下面按照Value进行倒序排列
        ArrayList> arrayList=new ArrayList>(hashMap.entrySet());
 
        Collections.sort(arrayList,new Comparator>(){
            @Override
 
            public int compare(Map.Entry o1,Map.Entry o2 ){
                //按照Value进行倒序,若Value相同,按照Key正序排序
                //方法1:return o2.getValue() - o1.getValue();
                //方法2:return o2.getValue().compareTo(o1.getValue());//对于Integer,String都是可以应用的
                //按照Value进行倒序,若Value相同,按照Key倒序排序
                int result = o2.getValue().compareTo(o1.getValue());
                //方法学习:public int compareTo( NumberSubClass referenceName )
                //referenceName -- 可以是一个 Byte, Double, Integer, Float, Long 或 Short 类型的参数。
                //返回值:如果指定的数与参数相等返回0。
                // 如果指定的数小于参数返回 -1。
                //如果指定的数大于参数返回 1
                if(result!=0){
                    return result;//即两个Value不相同,就按照Value倒序输出
                }else{
                    return o2.getKey().compareTo(o1.getKey());}
                    //若两个Value相同,就按照Key倒序输出
            }
        });
        //这里arrayList里的顺序已经按照自己的排序进行了调整
        for(int i=0;i e:hashMap.entrySet()){
 
            System.out.println(e);
            //1=10
            //2=9
            //3=6
            //4=7
            //5=7
            //这里表明hashMap中存取的内容顺序并没有进行任何改变,改变的是arrayList里的内容的顺序
        }
    }
}

参考文献:

https://blog.csdn.net/LvJinYang/article/details/102875095

https://blog.csdn.net/u014388729/article/details/80156645

到此这篇关于Map按单个或多个Value排序,当Value相同时按Key排序的文章就介绍到这了,更多相关Map按单个或多个Value排序内容请搜索站圈网以前的文章或继续浏览下面的相关文章希望大家以后多多支持站圈网!

版权声明:本文内容由小编收集网络,均来自网络用户自发贡献,版权归原作者所有,Web前端、电脑编程学习类网站不拥有其著作权,亦不承担相应法律责任。具体规则请查看《Web前端、电脑编程学习类网站用户服务协议》和《Web前端、电脑编程学习类网站知识产权保护指引》。如果您发现本站中有涉嫌抄袭的内容,填写联系本站管理员,一经查实,管理员将立刻删除涉嫌侵权内容。

上一篇:全面了解OAuth 2.0四种授权方式金三银四无惧面试

下一篇:babel7按需加载polyfill示例详解

本文标题:Map按单个或多个Value排序当Value相同时按Key排序

本文地址:https://www.zhano.cn/Java/68489.html

AD300

广告投放 | 联系我们 | 版权申明 | SiteMap

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:15234109 | 邮箱:15234109#qq.com(#换成@)

Copyright © 2019-2022 豫ICP备19001789号