List<HashMap<String,String>>实现自定义字符串排序(key排序、Value排序)

news2025/6/9 16:07:08

系列文章目录

SpringBoot+Vue3实现登录验证码功能
Java实现发送邮件(定时自动发送邮件)
换个角度使用Redis去解决跨域存取Session问题
Redis缓存穿透、击穿、雪崩问题及解决方法
Spring Cache的使用–快速上手篇

更多该系列文章请查看我的主页哦


文章目录

  • 系列文章目录
  • 前言
  • 一、根据Key值排序
    • 1.1.数据准备
    • 1.2.实现的方法
    • 1.3.效果展示
  • 二、根据Value值排序
    • 2.1.数据准备
    • 2.2.实现的方法
    • 2.3.效果展示
  • 三、扩展思路及方法的运用
  • 总结


前言

  根据一些真实需求遇到的问题,需进行排序后进行数据的封装展示。例如,现在有一个类型为List<HashMap<String,String>>的无序数据,list里的各个map的key值是一样的,但是value值是使用a,b,f,d等字母作为真实条件存储的值。展示时需通过这些条件中a,b,c,d,e,f的顺序去展示这些数据。在通过半个多小时的研究后,自己写了一个自定义的排序规则。这个规则适用于List套map形式的数据进行排序。在写完根据value排序后,顺便把根据每个key排序的情况进行了扩充。


一、根据Key值排序

1.1.数据准备

如下代码所示,准备自定义排序规则的strlist和需要进行排序的list2

  这里的strlist是排序规则,可以根据你想要的顺序进行排序展示(添加的顺序即为展示的顺序)。像这里我是key为a的排前,b,c,d,e,f的顺序排序各个map。这里的list2是在列表里准备了各个map的key和value值。当然这是以key值排序,所以key是属于自定义排序规则内的值。

      //自定义排序规则 添加的顺序(值)就是排序的顺序
      ArrayList<String> strlist=new ArrayList<>();
      strlist.add("a");
      strlist.add("b");
      strlist.add("c");
      strlist.add("d");
      strlist.add("e");
      strlist.add("f");
     //根据key排序
	 ArrayList<HashMap<String, String>> list2 = new ArrayList<>();
	 HashMap<String, String> hashMap5 = new HashMap<String, String>();
	 hashMap5.put("a","这是a");
	 list2.add(hashMap5);
	 HashMap<String, String> hashMap6 = new HashMap<String, String>();
	 hashMap6.put("c","这是c");
	 list2.add(hashMap6);
	 HashMap<String, String> hashMap7 = new HashMap<String, String>();
	 hashMap7.put("f","这是f");
	 list2.add(hashMap7);
	 HashMap<String, String> hashMap8 = new HashMap<String, String>();
	 hashMap8.put("b","这是b");
	 list2.add(hashMap8);
	 HashMap<String, String> hashMap9 = new HashMap<String, String>();
	 hashMap9.put("d","这是d");
	 list2.add(hashMap9);

1.2.实现的方法

  实现需将上述准备的list作为入参传入该方法进行操作:首先需定义一个新的list1,用来封装排序好的数据。然后是进行循环(外层为自定义规则的值,内层为排序前的数据),去循环的过程中根据自定义排序的strlist进行依次判断list(排序前的数据)是否存在自定义的值,存在即放到新的list1中,然后将排序好的list1返回。
提示:这里的最内层循环:我的每个map都存放的一个key,value,所以直接取值判断。如放多个值,需在最内层中写if判断根据哪个值进行对该map排序。这里在扩展中会说。。。

public static String sortKey(List<HashMap<String,String>> list,ArrayList<String> strlist) {
        ArrayList<HashMap<String, String>> list1 = new ArrayList<>();
        String keyc="";
        for (int i = 0; i < strlist.size(); i++) {
            for (int j = 0; j < list.size(); j++) {
                HashMap<String, String> map1 = list.get(j);
                //取值
                Set<String> keys = map1.keySet();
                for (String key : keys) {
                    //根据map里的哪个值排序 加if判断即可
                    keyc=key;
                }
                if(strlist.get(i).equals(keyc)){
                    list1.add(map1);
                }
            }
        }
        return list1.toString();
    }

1.3.效果展示

打印代码如下:

	System.out.println("根据map的key排序前="+list2);
    String sortKey = sortKey(list2,strlist);
    System.out.println("根据map的key排序后="+sortKey);

效果图展示如下图所示:可看到根据key值排序前后的不同。
在这里插入图片描述

二、根据Value值排序

2.1.数据准备

如下代码所示,准备自定义排序规则的strlist和需要进行排序的list

  这里的strlist是排序规则,可以根据你想要的顺序进行排序展示(添加的顺序即为展示的顺序)。像这里我是value为a的排前,b,c,d,e,f的顺序排序各个map。这里的list是在列表里准备了各个map的key和value值。当然这是以Value值排序,所以Value是属于自定义排序规则内的值。

        //自定义排序规则 添加的顺序(值)就是排序的顺序
        ArrayList<String> strlist=new ArrayList<>();
        strlist.add("a");
        strlist.add("b");
        strlist.add("c");
        strlist.add("d");
        strlist.add("e");
        strlist.add("f");

        //模拟数据list<HashMap<String,String>>
        ArrayList<HashMap<String, String>> list = new ArrayList<>();
        HashMap<String, String> hashMap = new HashMap<String, String>();
        hashMap.put("type","a");
        list.add(hashMap);
        HashMap<String, String> hashMap1 = new HashMap<String, String>();
        hashMap1.put("type","c");
        list.add(hashMap1);
        HashMap<String, String> hashMap3 = new HashMap<String, String>();
        hashMap3.put("type","f");
        list.add(hashMap3);
        HashMap<String, String> hashMap2 = new HashMap<String, String>();
        hashMap2.put("type","b");
        list.add(hashMap2);
        HashMap<String, String> hashMap4 = new HashMap<String, String>();
        hashMap4.put("type","d");
        list.add(hashMap4);

2.2.实现的方法

  实现需将上述准备的list作为入参传入该方法进行操作:首先需定义一个新的list1,用来封装排序好的数据。然后是进行循环(外层为自定义规则的值,内层为排序前的数据),去循环的过程中根据自定义排序的strlist进行依次判断list(排序前的数据)是否存在自定义的值,存在即放到新的list1中,然后将排序好的list1返回。 如果kay排序看懂了,相信value也能够轻松的看懂下述代码。
提示:这里的最内层循环:我的每个map都存放的一个key,value,所以直接取值判断。如放多个值,需在最内层中写if判断根据哪个值进行对该map排序。这里在扩展中会说。。。

public static String sortValue(List<HashMap<String,String>> list,ArrayList<String> strlist) {
        ArrayList<HashMap<String, String>> list1 = new ArrayList<>();
        for (int i = 0; i < strlist.size(); i++) {
            for (int j = 0; j < list.size(); j++) {
                HashMap<String, String> map1 = list.get(j);
                String type = map1.get("type");
                if(strlist.get(i).equals(type)){
                    list1.add(map1);
                }
            }
        }
        return list1.toString();
    }

2.3.效果展示

打印代码如下:

		System.out.println("根据map的value排序前="+list);
        //根据map值排序
        String sortValue = sortValue(list,strlist);
        System.out.println("根据map的value排序后="+sortValue);

效果图展示如下图所示:可看到根据key值排序前后的不同。
在这里插入图片描述

三、扩展思路及方法的运用

  对于方法中上述提到的如果map中有多个值的情况,需先定义哪个值作为排序的值

例如sortKey时,如果根据的是map中key为“score”进行排序,那么这里需这样写,如下述代码所示:

		//取值
       Set<String> keys = map1.keySet();
       for (String key : keys) {
           //根据map里的哪个值排序 加if判断即可
           if("score".equals(key)){
               keyc=key;
           }
       }

例如sortValue时,如果根据的是map中key为“type”的value进行排序,那么这里需这样写,如下述代码所示:

在这里插入图片描述


总结

  对于value的排序是我在工作中根据真实需求进行的编写,在编写的过程中也有很多想法。但在有限的时间内还是选择了这种比较耗时的算法。key的排序是我临时想到编写的,也是给大家一个思路。如有在value排序中比我这种方法好的想法或者代码欢迎在评论区讨论,我们一起交流学习~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1026858.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue路由与nodejs环境搭建

目录 一、Vue路由 1.1 SPA简介 1.2 路由简介 1.3 路由实现思路 1.3.1 引入vue-router的js依赖 1.3.2 定义组件 1.3.3 定义路由 1.3.4 组装路由器 1.3.5 将路由挂载根实例 1.3.6 定义触发路由的按钮 1.3.7 定义锚点 1.4 示例 二、nodejs环境搭建 2.1 nodejs简介 2…

MATLAB配置编译器(包括vs和mingw)

版本&#xff1a;matlab2022b&#xff0c;VS2022&#xff0c;mingw&#xff1a;8.1.0 之前安装好了matlab和vs后&#xff0c;在matlab的命令行输入 mex -setup时&#xff0c;自动找到并且配置好了vs编译器&#xff0c;可能是应为二者安装在了同一个根目录下&#xff0c;比如都在…

支付宝开发问题:很抱歉,系统监测到你的支付宝账号有异常,入驻失败,如需帮助请拨打热线

想开发个支付宝小程序&#xff0c;结果困难重重啊 妹的&#xff0c;这一个星期一直都被这个问题困扰&#xff0c;找了一个个体户资质&#xff0c;一直失败&#xff0c;专门去注册了一个公司&#xff0c;还是提交失败。 给支付宝客服打电话&#xff0c;跟没打一样&#xff0c;…

Kafka核心原理

一、kafka安装步骤 &#xff08;1&#xff09;配置profile文件 vim /etc/profile// KAFKA export KAFKA_HOME/opt/soft/kafka212 export PATH$KAFKA_HOME/bin:$PATHsource /etc/profile &#xff08;2&#xff09;创建kfkdata目录 cd /opt/soft/kafka212/ mkdir kfkdata …

OpenCV实现图像去水印功能(inpaint)

水印定位 需要根据图像特征获取水印的位置。 如图所示&#xff0c;图像左下角、右下角有水印。第一步&#xff0c;我们首先得定位水印所在位置。 Mat gray;cvtColor(src, gray, COLOR_BGR2GRAY);//图像二值化&#xff0c;筛选出白色区域部分Mat thresh;threshold(gray, thres…

可转债实战与案例分析——成功的和失败的可转债投资案例、教训与经验分享

实战与案例分析——投资案例研究 股票量化程序化自动交易接口 一、成功的可转债投资案例 成功的可转债投资案例提供了有价值的经验教训&#xff0c;以下是一个典型的成功案例&#xff1a; 案例&#xff1a;投资者B的成功可转债投资 投资者B是一位懂得风险管理的投资者&#…

LLM各层参数详细分析(以LLaMA为例)

网上大多分析LLM参数的文章都比较粗粒度&#xff0c;对于LLM的精确部署不太友好&#xff0c;在这里记录一下分析LLM参数的过程。 首先看QKV。先上transformer原文 也就是说&#xff0c;当h&#xff08;heads&#xff09; 1时&#xff0c;在默认情况下&#xff0c; W i Q W_i…

RabbitMQ - 死信、TTL原理、延迟队列安装和配置

目录 一、死信交换机 1.1、什么是死信交换机 1.2、TTL 1.2.1、什么是 TTL 1.2.2、通过 TTL 模拟触发死信 二、延迟队列 2.1、什么是延迟队列 2.2、配置延迟队列插件 2.2.1、延迟队列配置 a&#xff09;下载镜像 b&#xff09;运行容器 c&#xff09;刚刚设定的Rabb…

jmeter下载安装教程

一、下载安装jdk&#xff08;jmeter需要&#xff09; 1、首页下载jdk&#xff0c;地址&#xff1a;Java Downloads | Oracle 2、下载se&#xff0c;注意需要oracle账号&#xff0c;注册即可 这里的8u384代表JDK 8版本&#xff0c;384代表子版本&#xff0c;u是update(更新)的…

flink集群与资源@k8s源码分析-运行时

1 运行时 运行时提供了Flink作业运行过程依赖的基础执行环境,包含Dispatcher、ResourceManager、JobManager和TaskManager等核心组件,本节分析资源相关运行时组件构建和启动。 flink没有使用spring,缺少ioc的构建过程相当复杂,所有依赖手动关联和置入,为了共享组件,fli…

jenkins容器内配置python项目运行环境(Python3.7.3)

目录 1.查看启动的容器2.进入jenkins容器内部3.使用wget&#xff1a;提示没有wget命令4.查看jenkins容器系统版本5.换成国内源&#xff08;阿里&#xff09;5.更新apt-get6.安装wget7.创建python存放目录8.下载python9.解压10.安装依赖11.运行脚本configure12.make编译make ins…

汽车三高试验离不开的远程试验管理平台-TFM

随着信息技术的高速发展&#xff0c;企业对远程试验实时监控与数据管理的需求日益增强。而利用远程试验信息协同技术&#xff0c;可突破部门与地域的限制&#xff0c;并把试验现场的车辆状态信息、试验数据和分析结果实时传输给数据分析部门和设计部门等&#xff0c;从而缩短时…

什么是HTTP/2?它与HTTP/1.1相比有什么改进?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ HTTP/2 简介⭐ 主要的改进和特点1. 多路复用&#xff08;Multiplexing&#xff09;2. 头部压缩&#xff08;Header Compression&#xff09;3. 服务器推送&#xff08;Server Push&#xff09;4. 二进制传输&#xff08;Binary Protocol&…

12基于MATLAB的短时傅里叶变换( STFT),连续小波变换( CWT),程序已调通,可以直接运行。

基于MATLAB的短时傅里叶变换( STFT),连续小波变换( CWT),程序已调通&#xff0c;可以直接运行

jdk exe安装包如何自制zip解压版

jdk8 oracle官方下载页面 https://www.oracle.com/java/technologies/downloads/#java8-windows 可以看到&#xff0c;只有exe安装包 下载最新的exe安装包 解压 用7Zip解压 里面有好几个JAVA_CAB*文件夹&#xff0c;我们只需要关注两个&#xff1a;9和10&#xff0c;JAVA_CA…

【操作系统笔记】内存分配

内存对齐 问题&#xff1a;为什么需要内存对齐呢&#xff1f; 主要原因是为了兼容&#xff0c;为了让程序可以运行在不同的处理器中&#xff0c;有很多处理器在访问内存的时候&#xff0c;只能从特定的内存地址读取数据。换个说法就是处理器每次只能从内存取出特定个数字节的数…

卡尔曼滤波(Kalman Filter)C#测试

一、操作过程 刚学了一下卡尔曼滤波&#xff0c;具体原理还没细看&#xff0c;大致过程如下 分为两步&#xff0c;第一步Predict&#xff0c;以下两个公式 第二步Correct&#xff0c;以下三个公式 公式看起来很复杂&#xff0c;其中是我们要处理的数据&#xff0c; 是滤…

HTTP 协商缓存 ETag、If-None-Match

&#xff08;1&#xff09;浏览器第一次跟服务器请求一个资源&#xff0c;服务器在返回这个资源的同时&#xff0c;在respone header加上ETag。 ETag是服务器根据当前请求的资源生成的一个唯一标识。 这个唯一标识是一个字符串&#xff0c;只要资源有变化这个串就不同&#xff…

CSS的学习

1.认识CSS CSS 叫做"层叠样式表" “层叠样式表” 样式 --> 大小,位置,间距,颜色,字体,表框背景… 统称为"样式",描述了一个网页长什么样子~ 层叠 --> 针对一个html的元素/标签,可以同时应用多组CSS样式~~ 多组样式会叠加在一起~~ CSS描述的是页…

cocosCreator 之 Graphics绘制基础图形,五角星,线型图,柱形图

版本&#xff1a; 3.4.0 环境&#xff1a; Mac Graphics组件 Graphics组件主要用于绘画使用&#xff0c;属于渲染组件。继承结构&#xff1a; #mermaid-svg-WHveKVDzMTXmCbpg {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mer…