Java:List<Map>指定Key去重,差集(针对集合里面只有Map非实体对象)

2023-11-19

ListMap去重,差集(针对集合里面只有Map非实体对象)

问题:由于业务需求,接口的入参出参都是List格式,对于有些查出来的数据,为了防止重复的数据,需要对集合去重,以下分享一种去重的方法:

 /**
     * 该方法可根据指定字段对List<Map>中的数据去重,存在重复的,保存第一组Map
     * @param originMapList 源Map数组
     * @param keys 依据的去重字段
     * @return
     */
    public static List deleteDuplicatedMapFromListByKeys(
             List<Map<String,Object>> originMapList, List keys){
       if(CollectionUtils.isEmpty(originMapList)) return null;
        Map tempMap = new HashMap();
        for (Map originMap : originMapList) {
            String objHashCode = "";
            for (Object key : keys) {
                String value = originMap.get(key) != null ? originMap.get(key).toString()  : "";
                objHashCode += value.hashCode();
            }
            tempMap.put(objHashCode,originMap);
        }
        List valueList = new ArrayList<>(tempMap.values());
        return valueList;
    }

测试:

 public static void main(String[] args) {
        List<Map> list = new ArrayList<>();
        Map<String, Object> map1 = new HashMap<String, Object>();
        map1.put("id", "11");
        map1.put("name", "张翰");
        Map<String, Object> map2 = new HashMap<String, Object>();
        map2.put("id", "11");
        map2.put("name", "霍尊");
        Map<String, Object> map3 = new HashMap<String, Object>();
        map3.put("id", "22");
        map3.put("name", "吴签");
        list.add(map1);
        list.add(map2);
        list.add(map3);
        //创建去重的key的集合
        List<Object> deleteDuplicatedKeys = new ArrayList<>();
        deleteDuplicatedKeys.add("id");
        System.out.println("未去重的集合:"+list);
        List list1 = deleteDuplicatedMapFromListByKeys(list, deleteDuplicatedKeys);
        System.out.println("去重后的集合:"+list1);
    }

测试结果:

未去重的集合:[{name=张翰, id=11}, {name=霍尊, id=11}, {name=吴签, id=22}]
去重后的集合:[{name=霍尊, id=11}, {name=吴签, id=22}]

问题:由于业务需求,接口的入参出参都是List格式,需要对两个集合进行比较,找出集合中的差集

/**
     * 该方法查找两个List<Map>中的数据差集
     * @param originMapList  集合1
     * @param newMapList 集合2
     * @return
     */
    public static List<Map> differenceMapByList(List<Map> originMapList,List<Map> newMapList){
        if(CollectionUtils.isEmpty(originMapList)) return null;
        if (CollectionUtils.isEmpty(newMapList)) return null;
        List<Map> retList = new ArrayList<>();
        List<Map> listAll = new ArrayList<>();
        listAll.addAll(originMapList);
        listAll.addAll(newMapList);
        //过滤相同的集合
        List<Map> listSameTemp = new ArrayList<>();
        originMapList.stream().forEach(a -> {
            if(newMapList.contains(a))
                listSameTemp.add(a);
        });
        retList = listSameTemp.stream().distinct().collect(Collectors.toList());
        //去除重复的,留下两个集合中的差集
        listAll.removeAll(retList);
        retList = listAll;
        return retList;
    }

测试:

 public static void main(String[] args) {
       List<Map> listMap = new ArrayList<>();
        List<Map> list = new ArrayList<>();
        Map<String, Object> map1 = new HashMap<String, Object>();
        map1.put("id", "11");
        map1.put("name", "张翰");
        Map<String, Object> map2 = new HashMap<String, Object>();
        map2.put("id", "11");
        map2.put("name", "霍尊");
        Map<String, Object> map3 = new HashMap<String, Object>();
        map3.put("id", "22");
        map3.put("name", "吴签");
        list.add(map1);
        list.add(map2);
        list.add(map3);
        System.out.println("集合1:"+list);
        Map<String, Object> map4= new HashMap<String, Object>();
        map4.put("id", "22");
        map4.put("name", "吴签");
        listMap.add(map1);
        listMap.add(map4);
        System.out.println("集合2:"+listMap);
        //查找差集
        List list2 = deleteDuplicatedMapFromListByKeys1(list, listMap);
        System.out.println("集合的差集:"+list2);
    }

结果:

集合1[{name=张翰, id=11}, {name=霍尊, id=11}, {name=吴签, id=22}]
集合2[{name=张翰, id=11}, {name=吴签, id=22}]
集合的差集:[{name=霍尊, id=11}]

如果是对象的集合,利用Lambda表达式的方式是很快的哈,但listMap好像不太好用,可能我了解的不深哈,不知道怎么用,只能参考出这种。

参考文章:
java 两个List集合各种情况对比处理
Java : ListMap中 根据map的某个key去重

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

Java:List<Map>指定Key去重,差集(针对集合里面只有Map非实体对象) 的相关文章

随机推荐

  • 关于使用了中文用户名安装anaconda后jupyter报错问题解决 ---亲测有效

    win r 输入cmd后 弹出窗口里用户名是中文 有人会说 这个问题简单 直接改一下账户名即可 但这里只会使开机密码能改 dos窗口不会变 这样会导致一个问题 国外的某些软件 比如anaconda 要求启 动路径不能包含中文 必须是全英文
  • 第一天 复旦微FM33G048简单入门学习

    1 复旦微FM33G048基本参数 内容 参数 宽电压范围 1 8 5 5V 处理器内核 ARM Cortex M0 最高40MHz主频 SWD调试接口 支持用户 特权模式 支持中断向量表重定向 VTOR 低功耗技术平台 典型运行功耗180
  • 【零基础玩转BLDC系列】基于反电动势过零检测法的无刷直流电机控制原理

    无刷直流电动机基本转动原理请参考 基于HALL传感器的无刷直流电机控制原理 基本原理及基础知识本篇不再赘述 目录 反电势过零检测法的原理 反电势过零检测实现方法 位置传感器的存在限制了无刷直流电机在某些特定场合中的应用 如 使电机系统的体积
  • 试题库管理系统--数据库设计

    链接 https pan baidu com s 1ilMGCA n1GPDk3O8k7w7Gg 提取码 m0ke 复制这段内容后打开百度网盘手机App 操作更方便哦 一 概要设计 1 1 背景和意义 目前 许多高校绝大多数课程还采用考教统
  • Spring(二)控制反转

    控制反转是Spring框架的核心 用来消减计算机程序的耦合问题 依赖注入是IoC的另一种方法 只是从不同的角度上来描述的 通过 面向对象思想讨论控制反转和依赖注入两个概念 当某个java对象 调用者 需要调用另一个Java对象 被调用者 即
  • 声笔飞码6.00版使用指南

    声笔飞码6 00版使用指南 声笔飞码发明人兼设计人 戴石麟 电邮 sbxlm 126 com 一 声笔飞码6 00简介 声笔飞码在声笔码的基础上增加了偏旁部首对中文字词进行编码 用一个字母 通常取汉字读音的声母 有时也对偏旁部首进行形托 来
  • 7-1 两个有序链表序列的合并(编程题)

    已知两个非降序链表序列S1与S2 设计函数构造出S1与S2合并后的新的非降序链表S3 输入格式 输入分两行 分别在每行给出由若干个正整数构成的非降序序列 用 1表示序列的结尾 1不属于这个序列 数字用空格间隔 输出格式 在一行中输出合并后新
  • 完美数

    按照毕达哥拉斯的说法 数的完满取决于它的真因数 即除了自身以外的约数 例如 12的因数是 1 2 3 4 和 6 当一个数的各因数之和大于该数本身时 该数称为 盈 数 于是 12 是一个盈数 因为它的因数加起来等于 16 另一方面 当一个数
  • Linux Touch命令的8种使用技巧

    Linux touch命令不仅可以用于在Linux上创建空文件 您可以使用它来更改现有文件的时间戳 包括其访问权限和修改时间 本文介绍了8种可以通过Linux终端使用touch命令的方案 我们在Ubuntu 18 04 LTS Ubuntu
  • Stable Diffusion背后原理(Latent Diffusion Models)

    前言 2023年第一篇博客 大家新年好呀 这次来关注一下Stable Diffusion背后的原理 即 High Resolution Image Synthesis with Latent Diffusion Models 这篇论文 之前
  • Vc/MFC中自定义消息及其PostMessage触发使用

    http blog csdn net ztz0223 article details 2058402 http blog csdn net a8082649 article details 7733527 http bbs csdn net
  • chatgpt赋能python:Python写一个抽奖程序:从随机数生成到实现

    Python写一个抽奖程序 从随机数生成到实现 Python是当今最热门的编程语言之一 无论是开发网站 进行数据分析 实现机器学习 还是进行游戏开发 Python都可以胜任 在本文中 我们将介绍如何使用Python编写一个简单的抽奖程序 程
  • 文件上传 华为云服务器,文件上传云服务器

    文件上传云服务器 内容精选 换一换 HPC是高性能计算 High Performance Computing 的简称 通常指以计算为目的 使用了很多处理器的单个计算机系统或者使用了多台计算机集群的计算机系统和环境 能够执行一般个人电脑无法处
  • djangorestframework 序列化

    djangorestframework 序列化 序列化常用字段参数 1 选项参数 name serializers CharField min length 3 max length 20 max length 最大长度 min lengh
  • Matplotlib画条形图和柱形图并添加数据标注

    这里放上我比较喜欢的一种条形图设置 使用的是之前爬取的重庆地区链家二手房数据 数据如下 链接 https pan baidu com s 17CMwUAdseO8tJWHEQiA8 A 提取码 dl2g import pandas as p
  • java list stream 去除 null_Stream流的这些操作,你得知道,对你工作有很大帮助

    Stream流 Stream 流 是一个来自数据源的元素队列并支持聚合操作 元素是特定类型的对象 形成一个队列 Java中的Stream并不会存储元素 而 是按需计算 数据源 流的来源 可以是集合 数组等 聚合操作类似SQL语句一样的操作
  • 信号和槽

    1 信号和槽是一种高级接口 应用于对象之间的通信 它是QT的核心特性 也是QT区别于其它工具包的重要地方 信号和槽是QT自行定义的一种通信机制 2 moc Meta ObjectCompiler QT工具 该工具是一个C 预处理程序 它为高
  • Charles 安装及配置,详细步骤

    一 安装激活 1 1 下载 https www charlesproxy com download 1 2 激活 打开Charles gt Help gt Register Charles gt 输入 Registered Name htt
  • 2020.11.13 奇偶链表

    2020 11 13 奇偶链表 题目描述 给定一个单链表 把所有的奇数节点和偶数节点分别排在一起 请注意 这里的奇数节点和偶数节点指的是节点编号的奇偶性 而不是节点的值的奇偶性 请尝试使用原地算法完成 你的算法的空间复杂度应为 O 1 时间
  • Java:List<Map>指定Key去重,差集(针对集合里面只有Map非实体对象)

    ListMap去重 差集 针对集合里面只有Map非实体对象 问题 由于业务需求 接口的入参出参都是List格式 对于有些查出来的数据 为了防止重复的数据 需要对集合去重 以下分享一种去重的方法 该方法可根据指定字段对List