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值排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • SpringBoot整合SpringSession实现分布式登录详情

    SpringBoot整合SpringSession实现分布式登录详情

    这篇文章主要介绍了SpringBoot整合SpringSession实现分布式登录详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • SpringBoot详细介绍SPI机制示例

    SpringBoot详细介绍SPI机制示例

    这篇文章主要介绍了深入解析Spring Boot的SPI机制详情,SPI是JDK内置的一种服务提供发现机制,可以用来启用框架扩展和替换组件,主要用于框架中开发,更多相关介绍,感兴趣的小伙伴可以参考一下下面文章内容
    2022-08-08
  • java 将数据加载到内存中的操作

    java 将数据加载到内存中的操作

    这篇文章主要介绍了java 将数据加载到内存中的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Java中的线程安全问题详细解析

    Java中的线程安全问题详细解析

    这篇文章主要介绍了Java中的线程安全问题详细解析,线程安全是如果有多个线程在同时运行,而这些线程可能会同时运行这段代码,程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,此时我们就称之为是线程安全的,需要的朋友可以参考下
    2023-11-11
  • java实现抖音飞机大作战

    java实现抖音飞机大作战

    这篇文章主要为大家详细介绍了java实现抖音飞机大作战,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • java封装及四种权限修饰符详解

    java封装及四种权限修饰符详解

    这篇文章主要介绍了java封装及四种权限修饰符详解,对属性进行封装,使用户不能直接输入数据,我们需要避免用户再使用"对象.属性"的方式对属性进行赋值
    2022-08-08
  • 关于SpringCloud整合RabbitMQ的实例

    关于SpringCloud整合RabbitMQ的实例

    这篇文章主要介绍了关于SpringCloud整合RabbitMQ的实例,消息队列是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成,是在消息的传输过程中保存消息的容器,需要的朋友可以参考下
    2023-07-07
  • 谈谈Spring AOP中@Aspect的高级用法示例

    谈谈Spring AOP中@Aspect的高级用法示例

    在Spring AOP中目前只有执行方法这一个连接点,下面这篇文章主要给大家介绍了关于Spring AOP中@Aspect的高级用法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-08-08
  • Java基于PDFbox实现读取处理PDF文件

    Java基于PDFbox实现读取处理PDF文件

    PDFbox是一个开源的、基于Java的、支持PDF文档生成的工具库,它可以用于创建新的PDF文档,修改现有的PDF文档,还可以从PDF文档中提取所需的内容。本文将具体介绍一下PDFbox读取处理PDF文件的示例代码,感兴趣的可以学习一下
    2022-02-02
  • Java FineReport报表工具导出EXCEL的四种方式

    Java FineReport报表工具导出EXCEL的四种方式

    这篇文章主要介绍了Java FineReport报表工具导出EXCEL的四种方式的相关资料,需要的朋友可以参考下
    2016-03-03

最新评论