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

2023-09-20 10:59:29

系列文章目录

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

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



前言

  根据一些真实需求遇到的问题,需进行排序后进行数据的封装展示。例如,现在有一个类型为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排序中比我这种方法好的想法或者代码欢迎在评论区讨论,我们一起交流学习~

更多推荐

Python灰帽编程——网页信息爬取

文章目录网页信息爬取1.相关模块1.1requests模块1.1.1模块中的请求方法1.1.2请求方法中的参数1.1.3响应对象中属性1.2RE模块1.2.1匹配单个字符1.2.2匹配一组字符1.2.3其他元字符1.2.4核心函数2.网页信息爬取2.1获取网页HTML源代码2.2提取图片地址2.3下载图片2.4完整脚本

【卖出备兑看涨期权策略(Covered_call)】

卖出备兑看涨期权策略(Covered_call)卖出备兑看涨期权策略是一种最基本的收入策略,该策略主要操作就是在持有标的资产的同时卖出对应的看涨期权合约,以此来作为从持有的标的资产中获取租金的一种方法。如果标的资产的价格上涨到行权价之上,那么卖出的看涨期权将被行权,那么投资者可以卖出手中持有的标的资产,投资者获得最初的

数据挖掘18大算法实现以及其他相关经典DM算法:决策分类,聚类,链接挖掘,关联挖掘,模式挖掘、图算法,搜索算法等

【机器学习入门与实践】入门必看系列,含数据挖掘项目实战:模型融合、特征优化、特征降维、探索性分析等,实战带你掌握机器学习数据挖掘专栏详细介绍:【机器学习入门与实践】合集入门必看系列,含数据挖掘项目实战:数据融合、特征优化、特征降维、探索性分析等,实战带你掌握机器学习数据挖掘。本专栏主要方便入门同学快速掌握相关知识。声明

React 全栈体系(十一)

第五章React路由五、向路由组件传递参数数据1.效果2.代码-传递params参数2.1Message/*src/pages/Home/Message/index.jsx*/importReact,{Component}from"react";import{Link,Route}from'react-router-d

向量数据库,能让AI再次起飞吗?

9月7-8日,深圳国际会展中心18号馆来了,来了,腾讯面向产业互联网领域规格最高、规模最大、覆盖最广的年度科技盛会-——-腾讯全球数字生态大会。9月7日,我们将聚焦产业未来发展新趋势,针对云计算、大数据、人工智能、安全、SaaS等核心数字化工具做关键进展发布,并联合生态伙伴推出最新行业场景解决方案。同时,携手全球权威商

mysql:列类型之float、double

mysql:列类型之float、double_mysqldouble_普通网友的博客-CSDN博客环境:window10vs2022.net6mysql8.0.25DBeaver参考:《MSDN:浮点数值类型(C#引用)》《mysql:11.1.4Floating-PointTypes(ApproximateValue

Flutter开发桌面应用的一些探索分享

引言在移动应用开发领域,Flutter已经赢得了广泛的认可和采用,成为了跨平台移动应用开发的瑞士军刀。然而,Flutter的魅力并不仅限于移动平台,它还可以用于开发桌面应用程序,为开发人员提供了一种全新的选择。本文将深入探讨Flutter在桌面应用开发中的应用,以及目前国内新颖的跨端开发技术。桌面应用开发的现状在过去,

RHCE---Linux的计划任务

文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言如果想要让自己设计的备份程序可以自动地在系统下面运行,而不需要手动来启动它,这是该如何处理?这些任务可以分为【单一】任务和【循环】任务,在系统内又是哪些服务在负责?有的工作是例行性的,而有些任务是临时发生的。但是计算机不在身边这时就可以使用计

【C语言】字符串函数

文章目录前言1.strcat2.strncpy3.strncat4.strncmp5.strstr6.strtok7.strerror8.strcat的模拟实现9.strstr的模拟实现总结添加链接描述前言大家好呀,今天给大家分享一下字符函数和字符串函数C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类

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

实战与案例分析——投资案例研究股票量化程序化自动交易接口一、成功的可转债投资案例成功的可转债投资案例提供了有价值的经验教训,以下是一个典型的成功案例:案例:投资者B的成功可转债投资投资者B是一位懂得风险管理的投资者,他在某家知名科技公司发行的可转债上发现了投资机会。以下是他的投资故事:投资背景:投资者B注意到该科技公司

大气化学在线耦合模式WRF/Chem

查看原文:区域气象-大气化学在线耦合模式(WRF/Chem)在大气环境领域实践随着我国经济快速发展,我国面临着日益严重的大气污染问题。近年来,严重的大气污染问题已经明显影响国计民生,引起政府、学界和人们越来越多的关注。大气污染是工农业生产、生活、交通、城市化等方面人为活动的综合结果,同时气象因素是控制大气污染的关键自然

热文推荐