最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java根據(jù)分組key構(gòu)建合并數(shù)據(jù)集的代碼詳解

 更新時間:2025年06月27日 09:02:22   作者:南國以南i  
這篇文章主要介紹了Java中如何對List數(shù)據(jù)進(jìn)行雙層分組合并,通過sub_product_name和approval_result作為分組鍵,使用rowspan實(shí)現(xiàn)跨行合并,最終生成前端可展示的結(jié)構(gòu)化數(shù)據(jù)集,需要的朋友可以參考下

背景

Java 需要返回一組數(shù)據(jù)供前端展示,獲取到的數(shù)據(jù)格式如下:
List<Map<String, Object>> varSummary 存在多組數(shù)據(jù),varSummary中map結(jié)構(gòu)一致

[{sub_product_name=生活費(fèi)-生意貸, approval_result=其它, marital_state=3},
 {sub_product_name=生活費(fèi)-生意貸, approval_result=其它, marital_state=3}, 
 {sub_product_name=生活費(fèi)-生意貸, approval_result=通過, marital_state=3},
 {sub_product_name=生活費(fèi)-聯(lián)合貸, approval_result=通過, marital_state=3}, 
 {sub_product_name=生活費(fèi)-聯(lián)合貸, approval_result=通過, marital_state=3}, 
 {sub_product_name=生活費(fèi)-聯(lián)合貸, approval_result=通過, marital_state=3}, 
 {sub_product_name=生活費(fèi)-聯(lián)合貸, approval_result=其他, marital_state=3}]

需求一:

已知需要合并分組的屬性有:sub_product_name、approval_result、varSummary中的數(shù)據(jù),需要構(gòu)建合并對象屬性

核心邏輯說明:

  1. 雙層分組處理:

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

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

  1. 合并規(guī)則:

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

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

# 參數(shù)說明:
{
	"colspan": 1,// 合并列數(shù)(固定為1)
	"col": 0, //起始第N列
	"rowspan":  3//合并行數(shù)
	"row": 0, //起始第N行
}


#輸出對象數(shù)據(jù):
{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 {
    
   /**
     * .
     * 構(gòu)建返回對象
     *
     * @param varSummary    原始數(shù)據(jù)
     * @param targetColumns 動態(tài)指定需要合并的值
     * @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()];  // 每列當(dāng)前分組的起始行索引
        String[] currentValues = new String[targetColumns.size()];  // 每列當(dāng)前分組的值

        // 初始化第一行的值
        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++) {
            // 檢查每列是否需要結(jié)束當(dāng)前分組
            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));
                    }

                    // 更新當(dāng)前分組起始位置
                    groupStarts[col] = row;

                    // 重置當(dāng)前值
                    if (row < n) {
                        currentValues[col] = currentVal;
                    }

                    // 當(dāng)外層列值變化時,重置內(nèi)層列的分組
                    for (int innerCol = col + 1; innerCol < targetColumns.size(); innerCol++) {
                        groupStarts[innerCol] = row;
                        if (row < n) {
                            currentValues[innerCol] = getStringValue(varSummary.get(row), targetColumns.get(innerCol));
                        }
                    }

                    // 跳出內(nèi)層列循環(huán),避免重復(fù)處理
                    break;
                }
            }
        }
        return result;
    }


	/**
     * .
     * 構(gòu)建輸出對象
     *
     * @param row     起始行
     * @param col     起始列
     * @param rowspan 合并行數(shù)
     * @param colspan 合并列數(shù)(固定值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) {
        // 示例數(shù)據(jù)構(gòu)造
        List<Map<String, Object>> varSummary = new ArrayList<>();

        Map<String, Object> map1 = new HashMap<>();
        map1.put("sub_product_name", "生活費(fèi)-生意貸");
        map1.put("approval_result", "其它");
        map1.put("marital_state", 3);
        varSummary.add(map1);

        Map<String, Object> map2 = new HashMap<>();
        map2.put("sub_product_name", "生活費(fèi)-生意貸");
        map2.put("approval_result", "其它");
        map2.put("marital_state", 3);
        varSummary.add(map2);

        Map<String, Object> map3 = new HashMap<>();
        map3.put("sub_product_name", "生活費(fèi)-生意貸");
        map3.put("approval_result", "通過");
        map3.put("marital_state", 3);
        varSummary.add(map3);


        Map<String, Object> map4 = new HashMap<>();
        map4.put("sub_product_name", "生活費(fèi)-聯(lián)合貸");
        map4.put("approval_result", "通過");
        map4.put("marital_state", 3);
        varSummary.add(map4);

        Map<String, Object> map5 = new HashMap<>();
        map5.put("sub_product_name", "生活費(fèi)-聯(lián)合貸");
        map5.put("approval_result", "通過");
        map5.put("marital_state", 3);
        varSummary.add(map5);


        Map<String, Object> map6 = new HashMap<>();
        map6.put("sub_product_name", "生活費(fèi)-聯(lián)合貸");
        map6.put("approval_result", "通過");
        map6.put("marital_state", 3);
        varSummary.add(map6);

        Map<String, Object> map7 = new HashMap<>();
        map7.put("sub_product_name", "生活費(fèi)-聯(lián)合貸");
        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);
        // 輸出結(jié)果
        for (Map<String, Integer> cell : mergeInfo) {
            System.out.println(cell);
        }

        /* 原始數(shù)據(jù)格式
        [{sub_product_name=生活費(fèi)-生意貸, approval_result=其它, marital_state=3},
        {sub_product_name=生活費(fèi)-生意貸, approval_result=其它, marital_state=3},
        {sub_product_name=生活費(fèi)-生意貸, approval_result=通過, marital_state=3},
        {sub_product_name=生活費(fèi)-聯(lián)合貸, approval_result=通過, marital_state=3},
        {sub_product_name=生活費(fèi)-聯(lián)合貸, approval_result=通過, marital_state=3},
        {sub_product_name=生活費(fèi)-聯(lián)合貸, approval_result=通過, marital_state=3},
        {sub_product_name=生活費(fèi)-聯(lián)合貸, approval_result=其他, marital_state=3}]
        
        構(gòu)建輸出對象
        {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}*/
    }

總結(jié)

到此這篇關(guān)于Java根據(jù)分組key構(gòu)建合并數(shù)據(jù)集的代碼詳解的文章就介紹到這了,更多相關(guān)Java根據(jù)key構(gòu)建數(shù)據(jù)集內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java后端限制頻繁請求和重復(fù)提交的實(shí)現(xiàn)

    Java后端限制頻繁請求和重復(fù)提交的實(shí)現(xiàn)

    很多用戶會請求過于頻繁或者是多次重復(fù)提交數(shù)據(jù),本文主要介紹了Java后端限制頻繁請求和重復(fù)提交的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Springboot Apollo配置yml的問題及解決方案

    Springboot Apollo配置yml的問題及解決方案

    這篇文章主要介紹了Springboot Apollo配置yml的問題及解決方案,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • Springboot整合Netty實(shí)現(xiàn)RPC服務(wù)器的示例代碼

    Springboot整合Netty實(shí)現(xiàn)RPC服務(wù)器的示例代碼

    這篇文章主要介紹了Springboot整合Netty實(shí)現(xiàn)RPC服務(wù)器的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Java實(shí)現(xiàn)序列化與反序列化的簡單示例

    Java實(shí)現(xiàn)序列化與反序列化的簡單示例

    序列化與反序列化是指Java對象與字節(jié)序列的相互轉(zhuǎn)換,一般在保存或傳輸字節(jié)序列的時候會用到,下面有兩個Java實(shí)現(xiàn)序列化與反序列化的簡單示例,不過還是先來看看序列和反序列化的具體概念:
    2016-05-05
  • 淺談Java中的final關(guān)鍵字與C#中的const, readonly關(guān)鍵字

    淺談Java中的final關(guān)鍵字與C#中的const, readonly關(guān)鍵字

    下面小編就為大家?guī)硪黄獪\談Java中的final關(guān)鍵字與C#中的const, readonly關(guān)鍵字。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • 詳解springboot中使用異步的常用兩種方式及其比較

    詳解springboot中使用異步的常用兩種方式及其比較

    這篇文章主要介紹了詳解springboot中使用異步的常用兩種方式及其比較,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Java Stream流零基礎(chǔ)教程

    Java Stream流零基礎(chǔ)教程

    Java8的另一大亮點(diǎn)Stream,它與java.io包里的InputStream和OutputStream是完全不同的概念,下面這篇文章主要給大家介紹了關(guān)于Java8中Stream詳細(xì)使用方法的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Java中隨機(jī)函數(shù)變換的示例詳解

    Java中隨機(jī)函數(shù)變換的示例詳解

    這篇文章主要為大家詳細(xì)介紹了Java中隨機(jī)函數(shù)的變換,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Java有一定的幫助,感興趣的可以了解一下
    2022-08-08
  • Java MySQL動態(tài)語句編寫實(shí)現(xiàn)方式

    Java MySQL動態(tài)語句編寫實(shí)現(xiàn)方式

    這篇文章主要介紹了Java MySQL動態(tài)語句編寫實(shí)現(xiàn)方式,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-04-04
  • Spring的注解簡單介紹

    Spring的注解簡單介紹

    這篇文章主要介紹了Spring的注解簡單介紹,具有一定借鑒價值,需要的朋友可以參考下
    2017-12-12

最新評論

清新县| 河北区| 鲁山县| 交口县| 保定市| 望江县| 依安县| 凤冈县| 宝清县| 饶平县| 顺义区| 黎平县| 遂宁市| 辛集市| 德州市| 辽阳县| 巴东县| 赫章县| 陕西省| 景宁| 宿迁市| 平舆县| 新田县| 康乐县| 绥滨县| 乌苏市| 武定县| 类乌齐县| 铁力市| 乡宁县| 墨江| 集贤县| 专栏| 江津市| 东明县| 梨树县| 新竹市| 卫辉市| 会泽县| 封丘县| 华蓥市|