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

系列文章目录

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.mzph.cn/news/88838.shtml

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

相关文章

游戏技术亮点|Aavegotchi 与 GameSwift 建立合作伙伴关系

构建一个优秀的游戏只是成功发布的一部分&#xff0c;让数百万玩家体验这款游戏才是真正的乐趣所在。 这也是为什么我们很高兴宣布与 GameSwift 建立了新的合作伙伴关系&#xff0c;GameSwift 是一款先进的模块化游戏区块链&#xff0c;采用 zkEVM 技术构建&#xff0c;是全球…

切割VOC的图像和他的标签

切割VOC的图像 背景代码 背景 图像及对应xml文件切割 需要将图像切分为819,819的子图像 代码 import os import xml.etree.ElementTree as ET from PIL import Imagedef crop_one_image_and_xml(image_path, annotation_path, output_path, filename):# -*- coding: encoding…

[Zer0pts2020]Can you guess it? basename特性 和preg_match 绕过

直接就可以进入看看源代码 原本以为这道题目有两个方法来做 但是 后面发现第二个没有找到漏洞 这里考点主要就是 正则和 basename的特性 首先就是正则 现在出现一个知识点 就是 /index.php/config.php 这种路径 访问的还是 index.php 我们可以试试看 还是在index.php中过…

基于微信小程序的明星应援小程序设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

golang工程——常用数据结构底层原理【mao、slice、func、string】

字符串 其实就是字符数组 注意 字节数组与字符串可以相互转换 a : "hello world" b : []byte(a) c : string(b)字节数组转换为字符串在运行时调用了slicebytetostring函数。需要注意的是&#xff0c;字节数组与字符串的相互转换并不是简单的指针引用&#xff0c;…

【实战详解】如何快速搭建接口自动化测试框架?Python + Requests

摘要&#xff1a; 本文主要介绍如何使用Python语言和Requests库进行接口自动化测试&#xff0c;并提供详细的代码示例和操作步骤。希望能对读者有所启发和帮助。 前言 随着移动互联网的快速发展&#xff0c;越来越多的应用程序采用Web API&#xff08;也称为RESTful API&…

分类预测 | Matlab实现GA-RF遗传算法优化随机森林多输入分类预测

分类预测 | Matlab实现GA-RF遗传算法优化随机森林多输入分类预测 目录 分类预测 | Matlab实现GA-RF遗传算法优化随机森林多输入分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现GA-RF遗传算法优化随机森林多输入分类预测&#xff08;完整源码和数据&…

如何进一步全面提高项目估算精准度?

项目估算非常重要&#xff0c;这直接关系着项目的成本和收入&#xff0c;如果估算不准确&#xff0c;将为项目带来较大风险。一般软件规模可以用多种方式进行估算&#xff0c;但是用功能点估算方式更准确&#xff0c;而自动估算让估算更快速&#xff0c;我们以CoCode开发的估算…

【Go】rsrc不是内部或外部命令、无法将“rsrc”项识别为 cmdlet、函数、脚本文件或可运行程序的名称 解决方法

前言 想尝试用go创建一个桌面应用程序&#xff0c;然后查了下决定用 walk。 我们要先下载walk&#xff0c;这里 官方链接 按照官方文档&#xff0c;我们先用go get命令下载。 go get github.com/lxn/walk然后分别创建好了 main.go、main.manifest 文件&#xff0c;代码如下…

libtorch之tensor的使用

1. tensor的创建 tensor的创建有三种常用的形式&#xff0c;如下所示 ones创建一个指定维度&#xff0c;数据全为1的tensor. 例子中的维度是2维&#xff0c;5行3列。 torch::Tensor t torch::ones({5,3}); zeros创建一个指定维度&#xff0c;数据全为0的tensor&#xff0c;例子…

Java基于SpringBoot的民宿管理系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 开发环境&#xff1a;后端&#xff1a;前端&#xff1a;数据库&#xff1a; 系统架构&#xff1a…

nginx配置密码访问

安装htpasswd 因为需要使用到htpasswd&#xff0c;htpasswd是Apache服务器中生成用户认证的一个工具&#xff0c;如果未安装&#xff0c;则使用如下命令安装htpasswd。 yum install -y httpd-tools设置用户名和密码 htpasswd 安装成功后&#xff0c;就可以设置用户名和密码&am…

Java项目-Spring Boot的生鲜网上交易系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 系统功能4 功能设计5系统详细设计5.1系统功能模块5.2后台功能模块5\.2\.1用户功…

vscode左键无法跳转到定义的文件

之前用vscode的时候&#xff0c;明明是可以ctrl键鼠标左键跳转到定义文件的&#xff0c;突然之间就不行了&#xff0c;鼠标移到引入上根本都没有下划线&#xff0c;无法跳转 解决方法&#xff1a; 项目的根目录新建 jsconfig.json 文件&#xff0c;代码如下 {"compiler…

http基础教程(超详细)

HTTP HTTP 一 、基础概念 请求和响应报文URL 二、HTTP 方法 GETHEADPOSTPUTPATCHDELETEOPTIONSCONNECTTRACE 三、HTTP 状态码 1XX 信息2XX 成功3XX 重定向4XX 客户端错误5XX 服务器错误 四、HTTP 首部 通用首部字段请求首部字段响应首部字段实体首部字段 五、具体应用 连接管理…

敏捷发布列车初探2 ---- Agile Release Train

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 敏捷发布列车二、ART的特性2.敏捷团队为列车提供动力3.与共同节奏保持一致4.关键角色启用 三、ART的责任总结 敏捷发布列车 敏捷发布列车&#xff08;ART&#xff…

CentOS 7.5 centos failed to load selinux policy 错误解决方法

这是个 selinux 使能导致的&#xff0c; 关闭即可 在进入到内核选中界面&#xff0c;选中要启动的内核&#xff0c; 按键盘 e 就会进入启动参数界面 进入启动参数界面如图&#xff0c;按上下键找到 UTF8 UTF8如图&#xff0c; 添加 selinux0 添加完成如图&#xff0c; 按 ctr…

MQTT协议知识梳理,看完你就懂了

目录 一、MQTT简介 二、MQTT框架图 三、MQTT特点 四、MQTT协议原理 1.MQTT协议实现框图 3.网络传输与应用消息 4.MQTT客户端 5.MQTT服务器 6.MQTT协议中的订阅、主题、会话 五、MQTT优缺点 优点 缺点 一、MQTT简介 MQTT是基于TCP/IP协议栈构建的异步通信消息协议&a…

比特币 ZK 赏金系列:第 2 部分——查找哈希冲突

在我们的零知识赏金 (ZKB) 系列的第二部分中&#xff0c;我们将其应用于解决哈希冲突难题。在这样的谜题中&#xff0c;两个不同的输入散列到相同的输出。此类赏金可用于&#xff1a; 充当煤矿中的金丝雀&#xff0c;给我们一个有价值的提醒。存在冲突是散列函数较弱的标志&…

linux内网渗透

一、信息收集 主机发现&#xff1a; nmap -sP 192.168.16.0/24 端口探测 masscan -p 1-65535 192.168.16.168 --rate1000 开放端口如下 nmap端口详细信息获取 nmap -sC -p 8888,3306,888,21,80 -A 192.168.16.168 -oA ddd4-port目录扫描 gobuster dir…