Java中的Map集合根据key值排序的实现

 更新时间:2024年03月14日 09:00:28   作者:Rcain_R  
本文主要介绍了Java中的Map集合如何根据key值排序,包含使用TreeMap和使用lambda表达式和Stream流两种方法,具有一定的参考价值,感兴趣的可以了解一下

Map集合的键(key)默认是按照它们的hashCode排序的,这在有时间不符合业务排序。如果你想要根据Map的key值进行排序,一般以下有几种方法可以实现。

方法一:使用TreeMap

使用TreeMap类,它会自动根据key的自然顺序或自定义比较器进行排序。

1、使用key(String)的自然排序:

代码示例:

// 假设Map为HashMap
Map<String, Integer> unsortedMap = new HashMap<>();  
// 添加元素到unsortedMap  
unsortedMap = ... ;  

// 使用TreeMap进行排序
Map<String, Integer> sortedMap = new TreeMap<>(unsortedMap);

2、使用自定义规则排序,传入Comparator自定义排序规则:

// 假设为HashMap<String, Object> map
// 未排序的HashMap
Map<String, Object> unSortMap = ...; 

// 使用TreeMap并提供一个Comparator用于排序key
Map<String, Object> sortedMap = new TreeMap<>(new Comparator<String>() {
    @Override
    public int compare(String k1, String k2) {
        // 对于字符串key升序排序
        return k1.compareTo(k2);
        // 若需要降序排序,则可以改为
        // return k2.compareTo(k1);
    }
});

// 将原始Map的内容复制到TreeMap中,此时Map会根据key排序
sortedMap.putAll(unSortMap );

方法二:使用lambda表达式和Stream流简化操作

示例代码:

// 按照key 升序排序
Map<String, Object> sortedMap = unSortMap.entrySet().stream()
    .sorted(Map.Entry.comparingByKey())
    .collect(Collectors.toMap(
        Map.Entry::getKey,
        Map.Entry::getValue,
        // 解决可能存在的键冲突问题,默认保留第一个值
        (oldValue, newValue) -> oldValue,
        // 提供一个新的TreeMap实例作为收集器,用于保持排序
        () -> new TreeMap<>() 
    ));



// 或者,如果要降序排序
Map<String, Object> sortedMapDescending = originalMap.entrySet().stream()
    .sorted(Map.Entry.<String, Object>comparingByKey().reversed())
    .collect(Collectors.toMap(
        Map.Entry::getKey,
        Map.Entry::getValue,
        // 处理键冲突
        (oldValue, newValue) -> oldValue, 
        () -> new TreeMap<>()
    ));

注意:此处不论方法一、方法二,对于Map中key为String类型的数据,都是底层都是按照字典顺序进行排序的。

所以一旦有一些特殊要求的排序:

例如:key为:“123-234”,“2134-1234”,“2-123”,

需要根据key排序为: “2-123”,“123-234”,“2134-1234”时,就需要重新书写自定义的排序方法 或者 考虑其他的方式实现指定key排序了。

讨论一下: 上面key值的Map该如何排序:

// 例:“2-123”,“123-234”,“2134-1234”

Map<String, Object> unSortMap = new HashMap();
map.put("123-234","2");
map.put("2-123","1");
map.put("2134-1234","3");


// 使得unSortMap 按照key值为“2-123”,“123-234”,“2134-1234”进行排序

到此这篇关于Java中的Map集合根据key值排序的实现的文章就介绍到这了,更多相关Java中Map根据key值排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Java Online Exam在线考试系统的实现

    Java Online Exam在线考试系统的实现

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+springboot+vue+jsp+mysql+maven实现Online Exam在线考试系统,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • java组件smartupload实现上传文件功能

    java组件smartupload实现上传文件功能

    这篇文章主要为大家详细介绍了java组件smartupload实现上传文件功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • 为什么在foreach循环中JAVA集合不能添加或删除元素

    为什么在foreach循环中JAVA集合不能添加或删除元素

    今天给大家带来的文章是关于Java的相关知识,文章围绕着为什么在foreach循环中JAVA集合不能添加或删除元素展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • java实现简单的弹球游戏

    java实现简单的弹球游戏

    这篇文章主要为大家详细介绍了java实现简单的弹球游戏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • 启动异常invalid constant type:15的解决方案

    启动异常invalid constant type:15的解决方案

    今天小编就为大家分享一篇关于启动异常invalid constant type:15的解决方案,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 如何利用SpringAOP的返回通知处理数据加密返回

    如何利用SpringAOP的返回通知处理数据加密返回

    这篇文章主要介绍了如何利用SpringAOP的返回通知处理数据加密返回,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2024-12-12
  • Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】

    Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】

    这篇文章主要介绍了Java实现的二叉树常用操作,包括二叉树的前序建树,前中后递归非递归遍历及层序遍历等相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • Java毕业设计实战之食品溯源系统的实现

    Java毕业设计实战之食品溯源系统的实现

    这是一个使用了java+Springboot+Maven+mybatis+Vue+mysql+wd开发的食品溯源系统,是一个毕业设计的实战练习,具有食品溯源该有的所有功能,感兴趣的朋友快来看看吧
    2022-01-01
  • Spring Boot如何使用EhCache演示

    Spring Boot如何使用EhCache演示

    这篇文章主要介绍了Spring Boot如何使用EhCache演示,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 关于springboot中的自定义配置项

    关于springboot中的自定义配置项

    这篇文章主要介绍了关于springboot中的自定义配置项,在项目开发的过程中,经常需要自定义系统业务方面的配置文件及配置项,Spring Boot提供了@value注解、@ConfigurationProperties注解和Environment接口等3种方式自定义配置项,需要的朋友可以参考下
    2023-07-07

最新评论