Java实现List按条件分成多个子List

2023-05-16

一、业务场景

相信很多开发的小伙伴都有遇到过需要对表按特定条件进行查询,然后再进行归类,比如:对员工表进行检索,然后分别按他们所在的部门进行归类,一般的做法都是按部门唯一标识(比如部门编号、部门名称等)进行一次一次查询,这样做的缺点显而易见,会造成与数据库的多次连接,从而影响效率和性能。而我的做法是直接对员工表进行一次全部读取,然后在本地根据条件再进行归类,这就涉及到需要对List进行处理,将父List直接拆分成多个子List。当然,上面举的例子只是最简单的业务场景,实际场景可能错综复杂,但

二、Java实现

话不多说,直接上代码。当然,上面举的例子只是最简单的业务场景,实际场景可能错综复杂,但我下面提供参考的这段代码已经够用了。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class DealList {
	
    /**
     * 按照List<Map<String,Object>>里面map的某个value重新封装成多个不同的list, 原始数据类型List<Map
     * <String,Object>>, 转换后数据类型Map<String,List<Map<String,Object>>>
     * 
     * @param list
     * @param oneMapKey
     * @return
     */
    private static List<Map<String, Object>> change(List<Map<String, Object>> inList, String oneMapKey,
            List<Map<String, Object>> outList) {
        // 1.将某个key的值存在set中
        Set<Object> setTmp = new HashSet<Object>();
        for (Map<String, Object> tmp : inList) {
            setTmp.add(tmp.get(oneMapKey));
        }
        // 2.遍历set
        Iterator<Object> it = setTmp.iterator();
        while (it.hasNext()) {
            String oneMapValueStr = "";
            String oneSetTmpStr = (String) it.next();
            Map<String, Object> oneSetTmpMap = new HashMap<String, Object>();
            List<Map<String, Object>> oneSetTmpList = new ArrayList<Map<String, Object>>();
 
            for (Map<String, Object> tmp : inList) {
                oneMapValueStr = (String) tmp.get(oneMapKey);
                if (oneSetTmpStr.equals(oneMapValueStr)) {
                    oneSetTmpMap.put("text", oneSetTmpStr);
                    oneSetTmpList.add(tmp);
                }
            }
            oneSetTmpMap.put("array", oneSetTmpList);
            outList.add(oneSetTmpMap);
        }
        return outList;
    }
 
	public static void main(String[] args) {
		Map<String, Object> map1 = new HashMap<String, Object>();
		Map<String, Object> map2 = new HashMap<String, Object>();
		Map<String, Object> map3 = new HashMap<String, Object>();
		Map<String, Object> map4 = new HashMap<String, Object>();

		List<Map<String, Object>> inList = new ArrayList<Map<String, Object>>();
		map1.put("dept", "开发部");
		map1.put("name", "张三");

		map2.put("dept", "业务部");
		map2.put("name", "李华");

		map3.put("dept", "开发部");
		map3.put("name", "李四");

		map4.put("dept", "业务部");
		map4.put("name", "王明");

		inList.add(map1);
		inList.add(map2);
		inList.add(map3);
		inList.add(map4);
		System.out.println("原始的List:" + inList);

		List<Map<String, Object>> outList = new ArrayList<Map<String, Object>>();
		outList = change(inList, "dept", outList);
		System.out.println("处理后的List:" + outList);

	}
}

结果:

原始的List:[{name=张三, dept=开发部}, {name=李华, dept=业务部}, {name=李四, dept=开发部}, {name=王明, dept=业务部}]
处理后的List:[{array=[{name=张三, dept=开发部}, {name=李四, dept=开发部}], text=开发部}, {array=[{name=李华, dept=业务部}, {name=王明, dept=业务部}], text=业务部}]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java实现List按条件分成多个子List 的相关文章

随机推荐

  • 【Ubuntu】Ubuntu20.04安装GPU显卡驱动

    一 安装显卡驱动 方式一 xff1a 图形界面安装 等待安装即可 方式二 xff1a 命令行安装 sudo apt get install nvidia driver 515 有些显卡只支持455 安装完成记得重启一下 xff0c 然后验证
  • 【Ubuntu】Ubuntu20.04安装NVIDIA Container Toolkit

    基于Apollo的CUDA的docker镜像需要依赖于NVIDIA Container Toolkit xff0c 运行以下命令安装NVIDIA Container ToolKit xff1a distribution 61 etc os
  • 【Cyber RT】Apollo Cyber RT安装

    一 下载源码 克隆Apollo 源码仓库 git clone https gitee com ApolloAuto apollo git xff08 耗时30min xff09 二 启动Apollo Docker 开发容器 进入到Apoll
  • 【导航规划】导航规划背景知识总结

    导航规划类型 xff1a 固定路径引导 1 有人工标识导引 xff08 AGV xff09 磁条导航 磁感应线导航 磁钉导航 二维码导航 AGV xff1a Automatic Guided Vehicle 自动导引车 优点 xff1a 技
  • 【Ubuntu】树莓派4B安装Ubuntu18.04(超详细)

    本教程主要记录下近期给树莓派4B安装Ubuntu18 04的过程 xff01 xff01 xff01 目录 一 下载Ubuntu18 04 Server版本 二 烧录 三 修改WiFi登录以及树莓派分辨率 1 修改wifi 2 修改分辨率
  • 【Summary】机器人方法汇总

    目录 一 软件安装篇 1 安装ROS 2 树莓派4B安装Ubuntu18 04 3 Ubuntu20 04安装GPU 4 Ubuntu20 04安装NVIDIA Container Toolkit 5 Apollo Cyber RT安装 二
  • linux---生产者和消费者模型(条件变量和信号量实现)

    问题的提出 在我们对一些全局变量的进行非原子性操作的时候就可能出现非线程安全 xff0c 比如我们吃面的问题 我们做面的人就是生产者 xff0c 吃面的人就是我们的消费者 xff0c 当我们的消费者需要吃面的时候就唤醒我们的生产者进行生产
  • 【SLAM学习】一些必备依赖包的安装与问题总结

    Ceres xff1a 下载地址 xff1a https github com ceres solver ceres solver releases tag 1 14 0 1 修改 sources list sudo gedit etc a
  • 【数据集】数据集下载总结

    1 AI Studio 数据集 开放数据集 百度AI Studio 人工智能学习与实训社区 2 天池 数据集 数据集 阿里系唯一对外开放数据分享平台 3 Papers with code 数据集 Machine Learning Datas
  • 【RealSense】L515学习记录

    Intel RealSense SDK 2 0的安装 1 注册服务器的公钥 sudo apt key adv keyserver keyserver ubuntu com recv key F6E65AC044F831AC80A06380C
  • 【YOLOv5】记录YOLOv5的学习过程

    以下记录的是Ubuntu20 04版本 xff0c 其他Ubuntu版本也相差不大 一 安装pytorch GPU版本 显卡驱动 CUDA cuDNN 下载pytorch GPU版本 xff1a 最新版本链接 xff1a Start Loc
  • 【Kinect】Ubuntu20.04 安装Azure Kinect Sensor

    本文主要记录Ubuntu20 04 安装Azure Kinect Sensor SDK Azure Kinect 人体跟踪 SDK官网 xff1a https learn microsoft com zh cn azure Kinect d
  • 【ORB_SLAM】Ubuntu20.04 配置ORB_SLAM3

    本文主要记录基于Ubuntu20 04环境下 xff0c 对普通的ORB SLAM3和稠密版本的ORB SLAM3进行环境的配置 一 配置ORB SLAM3 lt 普通版本 gt 1 安装ROS开发环境 这里采用鱼香ros的一键安装 xff
  • 【工具】记录安装Zsh

    本文主要记录下安装Zsh的过程 xff0c 方便后续换设备安装 xff01 与大家共同学习 xff01 xff08 Ubuntu 20 04 xff09 安装zsh sudo apt install zsh 2 下载oh my zsh 并安
  • 【Ubuntu】记录Ubuntu缺少启动项问题

    今天突然发现自己装的Ubuntu没有启动项 xff0c 也就是没有那个EFI分区 xff0c 人都麻了 xff01 原因是先把装Ubuntu的固态拿了出来 xff0c 再装的win11 xff0c 结果win11可以用了 xff0c Ubu
  • 【SLAM学习】基于Pangolin绘制运动轨迹

    Pangolin库 是一个轻量级的跨平台视图控制库 xff0c 主要用于可视化 交互和调试三维数据 该库提供了一系列图形界面工具 xff0c 包括窗口 OpenGL渲染器 3D相机 图像显示等 xff0c 可以方便地进行三维数据可视化和交互
  • Groovy学习-IO/文件操作

    读取文件 读取文本文件并打印每一行文本 new File 39 39 39 a txt 39 eachLine line gt println line eachLine方法是Groovy为File类自动添加的方法 xff0c 同时提供多个
  • linux---线程池种类以及实现(固定数量)

    线程池是什么 一堆固定的数量的或者有最大数量限制的线程 43 任务队列 gt 用于我们并发处理请求 xff0c 避免了大量频繁的线程的创建和销毁的事件成本 xff0c 同时避免了峰值压力带来瞬间大量线程被创建资源耗尽 xff0c 程序奔溃的
  • 什么是线程池?为什么使用线程池?

    1 什么是线程池 xff1f 线程池和数据库连接池非常类似 xff0c 可以统一管理和维护线程 xff0c 减少没有必要的开销 2 为什么要使用线程池 xff1f 因为频繁的开启线程或者停止线程 xff0c 线程需要重新从cpu从就绪状态调
  • Java实现List按条件分成多个子List

    一 业务场景 相信很多开发的小伙伴都有遇到过需要对表按特定条件进行查询 xff0c 然后再进行归类 xff0c 比如 xff1a 对员工表进行检索 xff0c 然后分别按他们所在的部门进行归类 xff0c 一般的做法都是按部门唯一标识 xf