Java 根據分組key構建合并數據集

文章目錄

  • 前言
  • 背景
  • 總結


前言

請各大網友尊重本人原創知識分享,謹記本人博客:南國以南i、


提示:以下是本篇文章正文內容,下面案例可供參考

背景

Java 需要返回一組數據供前端展示,獲取到的數據格式如下:
List<Map<String, Object>> varSummary 存在多組數據,varSummary中map結構一致

[{sub_product_name=生活費-生意貸, approval_result=其它, marital_state=3},{sub_product_name=生活費-生意貸, approval_result=其它, marital_state=3}, {sub_product_name=生活費-生意貸, approval_result=通過, marital_state=3},{sub_product_name=生活費-聯合貸, approval_result=通過, marital_state=3}, {sub_product_name=生活費-聯合貸, approval_result=通過, marital_state=3}, {sub_product_name=生活費-聯合貸, approval_result=通過, marital_state=3}, {sub_product_name=生活費-聯合貸, approval_result=其他, marital_state=3}]

需求一:
已知需要合并分組的屬性有:sub_product_name、approval_result、varSummary中的數據,需要構建合并對象屬性

核心邏輯說明:

  1. 雙層分組處理:

外層分組:按 sub_product_name 分組(示例中3條數據均相同)

內層分組:在外層分組內按 approval_result 分組(示例中前兩條"其它"相同,第三條"通過"不同)

  1. 合并規則:

第一列(col=0):合并相同 sub_product_name 的行(rowspan=3)

第二列(col=1):合并相同 approval_result 的連續行(rowspan=2)

# 參數說明:
{"colspan": 1,// 合并列數(固定為1)"col": 0, //起始第N列"rowspan":  3//合并行數"row": 0, //起始第N行
}#輸出對象數據:
{colspan=1, col=0, rowspan=3, row=0},
{colspan=1, col=0, rowspan=4, row=3},
{colspan=1, col=1, rowspan=2, row=0},
{colspan=1, col=1, rowspan=3, row=3}

核心代碼邏輯:

import com.wiseco.model.mgt.server.web.vo.resp.ReportOutputDto;import java.util.*;public class MergeCells {/*** .* 構建返回對象** @param varSummary    原始數據* @param targetColumns 動態指定需要合并的值* @return*/public static List<Map<String, Integer>> buildMergeInfo(List<Map<String, Object>> varSummary,List<String> targetColumns) {List<Map<String, Integer>> result = new ArrayList<>();if (varSummary == null || varSummary.isEmpty() || targetColumns == null || targetColumns.isEmpty()) {return result;}int n = varSummary.size();int[] groupStarts = new int[targetColumns.size()];  // 每列當前分組的起始行索引String[] currentValues = new String[targetColumns.size()];  // 每列當前分組的值// 初始化第一行的值for (int col = 0; col < targetColumns.size(); col++) {currentValues[col] = getStringValue(varSummary.get(0), targetColumns.get(col));}// 遍歷每一行(從第1行開始)for (int row = 1; row <= n; row++) {// 檢查每列是否需要結束當前分組for (int col = 0; col < targetColumns.size(); col++) {String currentVal = (row < n) ?getStringValue(varSummary.get(row), targetColumns.get(col)) :null;// 如果列值變化或是最后一行boolean valueChanged = row < n && !Objects.equals(currentVal, currentValues[col]);if (valueChanged || row == n) {int groupSize = row - groupStarts[col];if (groupSize > 1) {result.add(createCellInfo(groupStarts[col], col, groupSize, 1));}// 更新當前分組起始位置groupStarts[col] = row;// 重置當前值if (row < n) {currentValues[col] = currentVal;}// 當外層列值變化時,重置內層列的分組for (int innerCol = col + 1; innerCol < targetColumns.size(); innerCol++) {groupStarts[innerCol] = row;if (row < n) {currentValues[innerCol] = getStringValue(varSummary.get(row), targetColumns.get(innerCol));}}// 跳出內層列循環,避免重復處理break;}}}return result;}/*** .* 構建輸出對象** @param row     起始行* @param col     起始列* @param rowspan 合并行數* @param colspan 合并列數(固定值1)* @return*/private static Map<String, Integer> createCellInfo(int row, int col, int rowspan, int colspan) {Map<String, Integer> cell = new HashMap<>();cell.put("row", row);cell.put("col", col);cell.put("rowspan", rowspan);cell.put("colspan", colspan);return cell;}private static String getStringValue(Map<String, Object> map, String key) {Object value = map.get(key);return (value != null) ? value.toString() : null;}}

測試案例:

public static void main(String[] args) {// 示例數據構造List<Map<String, Object>> varSummary = new ArrayList<>();Map<String, Object> map1 = new HashMap<>();map1.put("sub_product_name", "生活費-生意貸");map1.put("approval_result", "其它");map1.put("marital_state", 3);varSummary.add(map1);Map<String, Object> map2 = new HashMap<>();map2.put("sub_product_name", "生活費-生意貸");map2.put("approval_result", "其它");map2.put("marital_state", 3);varSummary.add(map2);Map<String, Object> map3 = new HashMap<>();map3.put("sub_product_name", "生活費-生意貸");map3.put("approval_result", "通過");map3.put("marital_state", 3);varSummary.add(map3);Map<String, Object> map4 = new HashMap<>();map4.put("sub_product_name", "生活費-聯合貸");map4.put("approval_result", "通過");map4.put("marital_state", 3);varSummary.add(map4);Map<String, Object> map5 = new HashMap<>();map5.put("sub_product_name", "生活費-聯合貸");map5.put("approval_result", "通過");map5.put("marital_state", 3);varSummary.add(map5);Map<String, Object> map6 = new HashMap<>();map6.put("sub_product_name", "生活費-聯合貸");map6.put("approval_result", "通過");map6.put("marital_state", 3);varSummary.add(map6);Map<String, Object> map7 = new HashMap<>();map7.put("sub_product_name", "生活費-聯合貸");map7.put("approval_result", "其他");map7.put("marital_state", 3);varSummary.add(map7);// 生成合并信息List<String> targetColumns = Arrays.asList("marital_state","sub_product_name");List<Map<String, Integer>> mergeInfo = buildMergeInfo(varSummary, targetColumns);System.out.println(varSummary);// 輸出結果for (Map<String, Integer> cell : mergeInfo) {System.out.println(cell);}/* 原始數據格式[{sub_product_name=生活費-生意貸, approval_result=其它, marital_state=3},{sub_product_name=生活費-生意貸, approval_result=其它, marital_state=3},{sub_product_name=生活費-生意貸, approval_result=通過, marital_state=3},{sub_product_name=生活費-聯合貸, approval_result=通過, marital_state=3},{sub_product_name=生活費-聯合貸, approval_result=通過, marital_state=3},{sub_product_name=生活費-聯合貸, approval_result=通過, marital_state=3},{sub_product_name=生活費-聯合貸, approval_result=其他, marital_state=3}]構建輸出對象{colspan=1, col=0, rowspan=3, row=0}{colspan=1, col=0, rowspan=4, row=3}{colspan=1, col=1, rowspan=2, row=0}{colspan=1, col=1, rowspan=3, row=3}*/}

總結

我是南國以南i記錄點滴每天成長一點點,學習是永無止境的!轉載請附原文鏈接!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/88585.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/88585.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/88585.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux平臺Oracle開機自啟動設置

網上和官方文檔已經有不少介紹如何設置開機啟動Oracle實例的文章(Linux平臺)&#xff0c;不過以sysvinit和service這種方式居多。最近遇到了UAT環境的服務器打補丁后需要重啟服務器的情況&#xff0c; 需要DBA去手工啟動Oracle實例的情形&#xff0c;和同事討論&#xff0c;決定…

商品中心—商品B端搜索系統的實現文檔(二)

8.步驟四&#xff1a;基于索引實現搜索功能 (1)基于suggest索引的自動補全實現 實現自動補全的代碼比較簡單&#xff0c;其原理是&#xff1a;把搜索詞匯和倒排索引里的所有前綴匹配的詞條進行score比較&#xff0c;然后把分數最高的那些返回&#xff0c;其中會涉及到suggest索…

Codeforces Round 1027 (Div. 3)

A. Square Year 題目大意 給你一個四個字符的字符串&#xff0c;代表一個數字s 問是否存在a,b兩個數字&#xff0c;使得 ( a b ) 2 s (ab)^2s (ab)2s 思路 如果s是奇數或不能被開根號一定不行 設sq為s開根號后的結果 將sq一分為2&#xff0c;考慮sq/2有沒有余數的情況 //…

時序數據庫IoTDB的架構、安裝啟動方法與數據模式總結

一、IoTDB的架構 IoTDB的架構主要分為三個部分&#xff1a; ?時序文件&#xff08;Tsfile&#xff09;?&#xff1a; 專為時序數據設計的文件存儲格式。支持高效的壓縮和查詢性能。可獨立使用&#xff0c;并可通過TsFileSync工具同步至HDFS進行大數據處理。 ?數據庫引擎?…

ArrayList和LinkedList詳解

在Java后端開發中&#xff0c;集合框架是我們日常編程不可或缺的工具&#xff0c;它為數據存儲和操作提供了豐富的實現方式。作為Java集合框架中最常用的兩種List實現&#xff0c;ArrayList和LinkedList各自具有獨特的特性和適用場景。 1. 基本概念 1.1 ArrayList的定義與特性…

警惕微軟Entra ID風險:訪客賬戶存在隱蔽的權限提升策略

訪客用戶訂閱權限漏洞解析 微軟Entra ID的訂閱管理存在訪問控制缺陷&#xff0c;允許訪客用戶在受邀租戶中創建和轉移訂閱&#xff0c;同時保留對這些訂閱的完全所有權。訪客用戶只需具備在源租戶創建訂閱的權限&#xff0c;以及受邀成為外部租戶訪客的身份即可實施此操作。這…

EEG分類攻略2-Welch 周期圖

在EEG信號處理的上下文中&#xff0c;使用Welch方法來估算信號的功率譜密度&#xff08;Power Spectral Density, PSD&#xff09;是一種常見的做法。你的代碼片段是利用**scipy.signal.welch**函數來進行功率譜密度估算&#xff0c;并且涉及到一些關鍵的參數和步驟。讓我們逐步…

開疆智能CCLinkIE轉ModbusTCP網關連接脈沖計數器配置案例

本案例是三菱PLC通過CCLinkIE轉ModbusTCP網關連接脈沖計數器的配置案例&#xff0c;具體配置如下。 配置過程&#xff1a; 首先設置從站通訊參數 主要設置IP地址&#xff0c;工作模式以及端口號&#xff08;Modbus默認502&#xff09; 找到通訊點表&#xff0c;找到需要讀寫的…

gRPC 使用(python 版本)

.proto 文件 .proto 文件 是 gRPC 和 Protocol Buffers 的接口定義文件&#xff0c;它描述了&#xff1a; 要傳遞什么數據&#xff08;也就是消息體 message&#xff09;。要暴露什么接口&#xff08;也就是服務 service 和它們的 方法&#xff09;。 也就是一份規范文件&am…

VMware安裝

勾選【增強型鍵盤驅動程序】 #后期虛擬機用鼠標鍵盤比較好用 VMware創建主機Windows2 選擇類型配置【自定義】 安裝客戶機操作系統【稍后安裝操作系統】 客戶機操作系統【Microsoft Windows】,版本選Windows最高版本 【固件類型】默認UEFI 【處理器配置】選1個處理…

【沉浸式解決問題】微服務子模塊引入公共模塊的依賴后無法bean未注入

目錄 一、問題描述二、場景還原三、原因分析四、解決方案五、拓展知識參考文獻 一、問題描述 在微服務項目中的公共模塊進行了Mybatis Plus配置&#xff0c;創建了配置類并添加了Configuration注解&#xff0c;其他模塊引入該模塊后不生效 我這里是在Mybatis Plus公共模塊中注…

SQL進階:CASE表達式

目錄 1、用一條SQL語句進行不同條件的統計 建表語句&#xff08;MySQL8&#xff09;&#xff1a; 錄入數據&#xff1a; *按性別統計SQL 輸出結果&#xff08;行列轉換&#xff09; 2、在UPDATE語句里進行條件分支 建表語句&#xff08;MySQL8&#xff09;&#xff1a;…

哪四款AI工具讓3D人物手辦制作如此簡單?

在當今數字化時代&#xff0c;AI技術的飛速發展為我們的生活帶來了諸多便利和驚喜。其中&#xff0c;AI生成3D人物手辦工具的出現&#xff0c;讓我們能夠輕松地將自己的創意和想象轉化為實體手辦&#xff0c;滿足了眾多手辦愛好者的個性化需求。今天&#xff0c;我將為大家推薦…

Docker高級管理--Dockerfile鏡像制作

目錄 一:Docker 鏡像管理 1:Docker 鏡像結構 2:Dockerfile介紹 二:Dockerfile 語法基礎 1:基礎指令 2:環境設置指令 3:文件操作指令 4:執行命令指令 5:網絡和暴露端口指令 6.容器掛載指令 三&#xff1a;dockerfile案例 1.構建nginx容器 一:Docker 鏡像管理 Docker…

數字時代的“靈魂”之爭:虛擬人形象的著作權困局與破局之道

首席數據官高鵬律師數字經濟團隊創作&#xff0c;AI輔助。 一、虛擬人的“數字生命”&#xff1a;一場關于“靈魂”的商業博弈 當一個虛擬偶像的“眼神”被復刻成千萬個相似的數字面孔&#xff0c;當一段虛擬主播的“聲音”被拆解為可交易的數據碎片——我們正在見證一個“數…

小型CI/CD搭建(TODO)

1 方案 因為是在國內&#xff0c;所以gitbub Actions&#xff0c;??Azure DevOps?這些就直接拜拜了。 目前主流的大概是三種&#xff1a; 1 阿里云效/騰訊云CODING 2 GitLab CE GitLab Runner 3 Gitee Jenkins deepeseek比較了一下如下&#xff1a; 阿里云效 vs Git…

Android Studio flutter項目運行、打包時間太長

Android Studio&#xff1a;Android Studio Meerkat Feature Drop | 2024.3.2 Patch 1 flutter Sdk&#xff1a;3.29.3 系統&#xff1a;windows flutter sdk從2.10.5升級到3.29.3&#xff0c;但是Flutter 3.16開始新增了使用 Gradle聲明式 plugins {} 塊&#xff0c;gradle文…

【OpenGL學習】(六)圖形添加紋理

文章目錄 【OpenGL學習】&#xff08;六&#xff09;圖形添加紋理紋理環繞紋理過濾紋理顏色與頂點顏色混合 OpenGL紋理介紹&#xff1a;https://learnopengl-cn.github.io/01%20Getting%20started/06%20Textures/ 【OpenGL學習】&#xff08;六&#xff09;圖形添加紋理 項目…

allure安裝

一、安裝java 需要安裝java環境&#xff0c;不安裝的話在運行前會報錯下列問題&#xff08;前提是安裝了allure未安裝java&#xff09; 1.官網地址&#xff1a;https://www.oracle.com/ 2.點擊”Download Java“ 3.選擇JDK正式版本&#xff08;需要jdk1.8&#xff09; 4.選擇W…

SpringBoot基于JavaWeb的城鄉居民基本醫療信息管理系統

概述 一個基于SpringBoot框架開發的JavaWeb醫療信息管理系統&#xff0c;采用了現代化的技術架構&#xff0c;功能全面&#xff0c;非常適合作為學習項目或二次開發的基礎。 主要內容 該系統主要包含以下核心功能模塊&#xff1a; ??用戶管理模塊?? 實現管理員、醫生、…