对数据进行补全

2023-11-06

想获取一批数据时,例如:

维度:

  1. 日期:2023-01-03 ~ 2023-02-03
  2. 品牌:【吉利、比亚迪、宝马】

指标值:销售数量:****

但是从源头获取时,只获取了部分数据,做趋势处理时,因为缺少数据图例不好看,想将没有获取的数据进行补全处理,销售数量显示为0即可

实现数据补全时要考虑到通用性:

  1. 数据属于不同的类
  2. 要补入不同的类字段中,可能是date、code、name、type........
  3. 可能会补多个维度

考虑以上场景,代码如下:

主方法


import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; 
import lombok.Data;

import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @description 
 */

@Data
class Obj{
    private LocalDate bizDate;
    private String name;
    private String carTypeCode;
    public Obj(){}
    public Obj(LocalDate bizDate,String name,String carTypeCode){
        this.bizDate = bizDate;
        this.name = name;
        this.carTypeCode = carTypeCode;
    }
}
public class FillData{
    public static void main(String[] args) {
        // 创建各种维度,key值要跟补全对象的字段名称一致
        Map<String,List<?>> map = new HashMap<>(16);
        map.put("bizDate", Arrays.asList(LocalDate.of(2023,1,2),LocalDate.of(2023,8,1)));
        map.put("name", Arrays.asList("张三","李四"));
        map.put("carTypeCode", Arrays.asList("奥迪","宝马","宝马"));

        // 添加单个数据,但最终结果是否会多于预期
        ArrayList<Obj> list = new ArrayList<>(); 
        list.add(new Obj(LocalDate.of(2023,1,2),"张三","宝马"));

        // 进行维度补全
        List<Obj> l1 = fillDataComplete(Obj.class,list ,map);
        l1.forEach(System.out::println);
    }
    /**
     * @param clazz     要补全的类class
     * @param dataList  要补全的集合,不可为null
     * @param map       要补全的维度数据
     */
    public static <T> List<T> fillDataComplete(Class<T> clazz,List<T> dataList,Map<String,List<?>> map){
        Map<String, Map<String, Object>> stringMap = transformDefaultMap(map);
        for (T t : dataList) {
            JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(t));
            // 存在多维度时需要将同一日期下的维度数据存放起来,以value串起来
            List<String> collect = map.keySet().stream().map(item -> jsonObject.getObject(item, String.class))
                    .collect(Collectors.toList());
            String existKey = String.join(Constant.SEPARATIVE_SIGN, collect);
            // 打印已经存在的key值
            System.err.println(existKey);
            stringMap.remove(existKey);
        }
        List<T> collect = stringMap.values().stream()
                .map(item -> JSON.parseObject(JSON.toJSONString(item), clazz))
                .collect(Collectors.toList());

        dataList.addAll(collect); 
        return dataList;
    }

    /** 将map进行笛卡尔积计算,以value拼接为key对结果map进行分类 */
    public static Map<String, Map<String, Object>> transformDefaultMap(Map<String, List<?>> defaultProperties){
        if(org.springframework.util.CollectionUtils.isEmpty(defaultProperties)) {
            return null;
        } 
        // 将map转为以全value为key的map
        Map<String, Map<String, Object>> fillMap = new HashMap<>(16);
        for (Map.Entry<String, List<?>> propertiesListEntry : defaultProperties.entrySet()) {
            // 将map中的数据放到临时map里面
            Map<String, Map<String, Object>>  fillMapTmp = BeanUtil.copyProperties(fillMap,HashMap.class);
            fillMap.clear();
            //
            for (Object prop : propertiesListEntry.getValue()) {
                if(org.springframework.util.CollectionUtils.isEmpty(fillMapTmp)){
                    Map<String,Object> itemMap = new HashMap<>(16);
                    // 字段属性为key,值为value放入map里,再放入以value为key的map中
                    itemMap.put(propertiesListEntry.getKey(),prop);
                    fillMap.put(prop.toString(),itemMap);
                    continue;
                } 
                for (Map.Entry<String, Map<String, Object>> stringMapEntry : fillMapTmp.entrySet()) {
                    Map<String, Object> valueMap = BeanUtil.copyProperties(stringMapEntry.getValue(),HashMap.class);
                    // 字段属性为key,值为value放入map里,再放入以value为key的map中
                    valueMap.put(propertiesListEntry.getKey(),prop);
                    fillMap.put( stringMapEntry.getKey() + Constant.SEPARATIVE_SIGN + prop , valueMap);
                }
            }
        }
        return fillMap;
    } 
}

输出结果:

存在的数据: 2023-01-02/张三/宝马
全部数据:
Obj(bizDate=2023-01-02, name=张三, carTypeCode=宝马)
Obj(bizDate=2023-08-01, name=张三, carTypeCode=宝马)
Obj(bizDate=2023-01-02, name=李四, carTypeCode=奥迪)
Obj(bizDate=2023-08-01, name=李四, carTypeCode=奥迪)
Obj(bizDate=2023-01-02, name=李四, carTypeCode=宝马)
Obj(bizDate=2023-08-01, name=张三, carTypeCode=奥迪)
Obj(bizDate=2023-08-01, name=李四, carTypeCode=宝马)
Obj(bizDate=2023-01-02, name=张三, carTypeCode=奥迪)

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

对数据进行补全 的相关文章

  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • 如何将 pfx 文件转换为 jks,然后通过使用 wsdl 生成的类来使用它来签署传出的肥皂请求

    我正在寻找一个代码示例 该示例演示如何使用 PFX 证书通过 SSL 访问安全 Web 服务 我有证书及其密码 我首先使用下面提到的命令创建一个 KeyStore 实例 keytool importkeystore destkeystore
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分

随机推荐

  • 蓝桥杯 寻找2020

    目录 问题描述 思路分析及代码 问题描述 小蓝有一个数字矩阵 里面只包含数字 0 和 2 小蓝很喜欢 2020 他想找到这个数字矩阵中有多少个 2020 小蓝只关注三种构成 2020 的方式 同一行里面连续四个字符从左到右构成 2020 同
  • 89个android学习样例源码

    源码下载链接 https pan baidu com s 1uT hsZQac7Hz3pOxX466Cw pwd 8888 提取码 8888 Android 仿京东金融首页头像效果 Android 实现Conquer应用源码 Android
  • 解决解密时出现"要解密的数据的长度无效" 或 "填充无效无法被移除" 的错误

    1 首先排除数据库中读取加密后的字段是否被强制截断 2 AES加密后的byte 首先应用base64 Convert ToBase64String 编码一次 若直接用utf8的话会报上述错误 若用unicode编码的话会解密成乱码 原因是加
  • java对象的内存模型详解:内存模型及对象头的奥秘

    在面试官的因势利导下 很多人对jvm的内存模型已经耳熟能详 但是对我们经常new 出来的对象 比如new Object 你了解它的内存模型吗 本篇文章将带你走进对象内部 真正去了解这个你最熟悉 也最不熟悉的的对象 一 对象的内存模型 先上图
  • (yolov5.train)-YOLOv3源码解析4-计算损失compute_loss()

    图像算法 yolov5 train YOLOv3源码解析4 计算损失compute loss 简书
  • linux安装anaconda及配置pytorch环境

    文章目录 下载anaconda 使用conda创建新环境 判断是否安装成功 判断pytorch是否安装成功 检验是否可以使用GPU 下载anaconda 这里有多种方法 可以下载到windows然后通过xftp传到linux服务器上 也可以
  • 狂刷200道数据结构与算法,我的华为面试经历分享

    基本概念面试题集 Spring 相关概念梳理 谈谈对Spring loC的理解 谈谈对Spring Dl的理解 BeanFactory 接口和ApplicationContext接口不同点是什么 请介绍你熟悉的Spring 核心类 并说明有
  • 累加器的作用

    累加器和算术逻辑单元 运算场所 指令寄存器 指令译码 定时及各种控制 信号产生电路 1 在运算器中 累加器是专门存放算术或逻辑运算的一个操作数和运算结果的寄存器 能进行加 减 读出 移位 循环移位和求补等操作 是运算器的主要部分 2 在中央
  • 大数据时代的 9 大Key-Value存储数据库

    在过去的十年中 计算世界已经改变 现在不仅在大公司 甚至一些小公司也积累了TB量级的数据 各种规模的组织开始有了处理大数据的需求 而目前关系型数据库在可缩放方面几乎已经达到极限 一个解决方案是使用键值 Key Value 存储数据库 这是一
  • JSR303和拦截器

    目录 一 JSR303 1 pom依赖 二 拦截器 1 什么是拦截器 2 拦截器与过滤器 3 应用场景 4 拦截器的快速入门 三 拦截器链 1 拦截器链的概念 2 TwoHandlerInterceptor java 3 在springmv
  • 912.排序数组

    目录 一 题目 二 代码 一 题目 912 排序数组 力扣 LeetCode 二 代码 class Solution public void MergeSort vector
  • C# 异常:已引发: "线程间操作无效: 从不是创建控件“textBox1”的线程访问它。" (System.InvalidOperationException)

    当使用多线程功能时 在子线程里修改UI控件参数时 如 textBox1 Text str 会引发异常 异常 已引发 线程间操作无效 从不是创建控件 textBox1 的线程访问它 System InvalidOperationExcepti
  • mysql脱库_php+mysql注入拿webshell到脱库

    注 此文章献给那些还对注入不怎么理解的人学习 本次实站过程已经过去一个月了 但是还是写出这个文章 来跟大家分享一下希望大家都能喜欢 就算这次大家再找到此战漏洞也别破坏 毕竟我们只是学习一下 目标站 http www XXXteam cn 注
  • Vue模板语法

    目录 前言 一 插值 1 1 文本 1 2 html 1 3 属性 1 4 class style绑定 1 5 表达式 二 指令 三 过滤器 四 计算属性 监听器 总结 前言 上次分享了Vue的入门 简单的入了个门 本篇文章将要分享的内容为
  • 从零开始学习JavaScript:轻松掌握编程语言的核心技能②

    从零开始学习JavaScript 轻松掌握编程语言的核心技能 一 JavaScript 函数 1 1 JavaScript 函数语法 1 2 局部 JavaScript 变量 1 3 全局 JavaScript 变量 二 JavaScrip
  • 细数阿里达摩院2019年的十个Flag

    戳蓝字 CSDN云计算 关注我们哦 来自 人工智能与大数据 作者 AI小哥 1月2日 阿里达摩院发布 2019十大科技趋势 在未来的一年 科技领域究竟会再次迎来春天 还是继续在寒冬中前行 达摩院给出了自己的判断 该报告覆盖智能城市 语音AI
  • springboot log4j:WARN No appenders could be found for logger

    这里写自定义目录标题 log4j WARN No appenders could be found for logger org springframework web context support StandardServletEnvi
  • 华北电力大学的计算机类专业排名,2018年华北电力大学王牌专业排行榜,考生和家长们都好好看看!...

    华北电力大学有两个校区 一个是北京校区 一个是保定校区 在理科类的院校中 这所大学还是非常不错的 小编有幸去这个学校玩过几次 这个学校的占地面积非常大 环境相对比较优美 而且学校的灯 师资力量也非常大 所以说呢 这次学校还是值得报考的 而且
  • EOS私钥恢复,EOS私钥破解,附私钥恢复破解程序

    EOS私钥恢复 EOS私钥破解 附私钥恢复破解程序 程序地址 https www eos key com 请用谷歌浏览器或火狐浏览器打开才能正常运行
  • 对数据进行补全

    想获取一批数据时 例如 维度 日期 2023 01 03 2023 02 03 品牌 吉利 比亚迪 宝马 指标值 销售数量 但是从源头获取时 只获取了部分数据 做趋势处理时 因为缺少数据图例不好看 想将没有获取的数据进行补全处理 销售数量显