数据分组排序示例

成品料号分组后排序示例

原始数据

[
	{
		"factory": "XA91",
		"level": 1,
		"bydpn": "2",
		"productPn": "1"
	},
	{
		"factory": "XA91",
		"level": 2,
		"bydpn": "3",
		"productPn": "2"
	},
	{
		"factory": "XA91",
		"level": 2,
		"bydpn": "4",
		"productPn": "2"
	},
	{
		"factory": "XA91",
		"level": 3,
		"bydpn": "5",
		"productPn": "3"
	},
	{
		"factory": "XA91",
		"level": 1,
		"bydpn": "7",
		"productPn": "6"
	},
	{
		"factory": "XA91",
		"level": 1,
		"bydpn": "21",
		"productPn": "11"
	},
	{
		"factory": "XA91",
		"level": 2,
		"bydpn": "22",
		"productPn": "21"
	}
]

返回结果

在这里插入图片描述

package com.jovi.test;

import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson2.JSON;
import lombok.Data;

import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * 1、获取顶层成品料号
 * 2、将所有数据按登记分组
 * 3、得到顶层成品料号及下级料号分组排序
 * 4、得到最终结果
 */
public class ProductPnGroupByLevelTest  {
    public static void main(String[] args) {
        System.out.println("-------start----------");
        //从最顶层成品料号开始计算
        calcFormLevel1();
    }

    /**
     * 从最顶层成品料号开始,以此往下查找
     */
    public static void calcFormLevel1() {
        //获取分层后的所有数据
        Map<Integer, List<DataObject>> levelMap = getDataMap();

        //顶层成品料号层级=1
        Integer minLevel = 1;
        // 1- 获取第一层数据集合
        List<DataObject> levelList_1 = levelMap.get(minLevel);
        //构造最终返回结果
        Map<String,Map<Integer, List<DataObject>>> resultMap = CollUtil.newHashMap();

        for(DataObject level1Obj: levelList_1) {
            //初始化递归所需参数
            Map<Integer, List<DataObject>> productPnMap = CollUtil.newHashMap();
            List<DataObject> dataObjectList = CollUtil.newArrayList();
            //查询到最顶层的成品料号
            String productPn = level1Obj.getProductPn();
            String bydPn = level1Obj.getBydpn();
            if(resultMap.containsKey(productPn)) {
                productPnMap = resultMap.get(productPn);
                if(CollUtil.isNotEmpty(productPnMap))
                    dataObjectList = productPnMap.get(minLevel);
            }
            dataObjectList.add(level1Obj);
            productPnMap.put(minLevel,dataObjectList);
            resultMap.put(level1Obj.getProductPn(),productPnMap);

            //调用递归方法得到顶层所有数据
            digui(minLevel, productPn, bydPn,levelMap, resultMap);
            System.out.println("-----------顶层成品料号 循环一次--"+productPn);
        }
        print(resultMap);
        System.out.println("-----------循环结束------------");
    }


    /**
     * 第一层的byd料号,找第二层的成品料号
     *
     */
    public static Map<String,Map<Integer, List<DataObject>>> digui(Integer level, String productPn, String bydPn,Map<Integer, List<DataObject>> originMap
            ,Map<String,Map<Integer, List<DataObject>>> resultMap){
        Integer maxLevel = originMap.size();//3层为例
        if(level>maxLevel) return resultMap;
        //取第一层的数据
        Map<Integer, List<DataObject>> productPnMap_1 = resultMap.get(productPn);
        //取出第一层的bydPn集合
        List<DataObject> bydPnList1 = productPnMap_1.get(level);

        level++;
        List<DataObject> secondList2 = originMap.get(level);//原始数据中获取下一层级数据

        if(CollUtil.isNotEmpty(bydPnList1)) {
            List<DataObject> bydPnList_1 = bydPnList1.stream().filter(obj -> Objects.equals(obj.getBydpn(), bydPn)).collect(Collectors.toList());
            if(CollUtil.isNotEmpty(bydPnList_1)) {
                for(DataObject obj1: bydPnList_1) {
                    List<DataObject> list2 = CollUtil.newArrayList();
                    if(CollUtil.isNotEmpty(secondList2)) {
                        for(DataObject obj2: secondList2) {
                            //查询最终结果对象中是,是否包含下一层数据
                            Map<Integer, List<DataObject>> nextLevelDataMap = resultMap.get(level);
                            if(CollUtil.isNotEmpty(nextLevelDataMap))
                                list2 = nextLevelDataMap.get(level);
                            //校验数据匹配规则: 工厂相同,上一层的bydPn等于下一层的成品料号
                            if(Objects.equals(obj1.getFactory(),obj2.getFactory()) && Objects.equals(obj1.getBydpn(),obj2.getProductPn())) {
                                list2.add(obj2);
                                productPnMap_1.put(level,list2);
                                resultMap.put(productPn,productPnMap_1);
                                digui(level,productPn,obj2.getBydpn(),originMap,resultMap);
                                continue;
                            }
                        }
                    }
                }
            }
        }
        return resultMap;

    }

    /**
     * 数据分层次展示
     */
    public static Map<Integer, List<DataObject>> getDataMap() {
        Map<Integer, List<DataObject>> dataMap = CollUtil.newHashMap();
        List<DataObject> dataList = getData();
        Map<Integer, List<DataObject>> collect = dataList.stream().collect(Collectors.groupingBy(DataObject::getLevel));
        return collect;
    }
    /**
     * 初始化数据转为对象数组
     * @return
     */
    public static List<DataObject> getData() {
        String data="[{\"factory\":\"XA91\",\"level\":1,\"bydpn\":\"2\",\"productPn\":\"1\"},{\"factory\":\"XA91\",\"level\":2,\"bydpn\":\"3\",\"productPn\":\"2\"},{\"factory\":\"XA91\",\"level\":2,\"bydpn\":\"4\",\"productPn\":\"2\"},{\"factory\":\"XA91\",\"level\":3,\"bydpn\":\"5\",\"productPn\":\"3\"},{\"factory\":\"XA91\",\"level\":1,\"bydpn\":\"7\",\"productPn\":\"6\"},{\"factory\":\"XA91\",\"level\":1,\"bydpn\":\"21\",\"productPn\":\"11\"},{\"factory\":\"XA91\",\"level\":2,\"bydpn\":\"22\",\"productPn\":\"21\"}]";
        List<DataObject> dataObjects = JSON.parseArray(data, DataObject.class);
        return dataObjects;
    }


    public static void print(Map<String,Map<Integer, List<DataObject>>> resultMap) {
        for(Map.Entry<String,Map<Integer, List<DataObject>>> entry:resultMap.entrySet()) {
            String productPn = entry.getKey();
            Map<Integer, List<DataObject>> valueMap = entry.getValue();
            for(Map.Entry<Integer, List<DataObject>> entry1:valueMap.entrySet()) {
                Integer level = entry1.getKey();
                List<DataObject> valueList1 = entry1.getValue();
                for(DataObject dataObject : valueList1) {
                    System.out.println("productPn="+productPn+" level=" +level + " productPn="+dataObject.getProductPn() + " bydPn="+ dataObject.getBydpn());
                }

            }
        }
    }

    @Data
    public class DataObject {
        private String productPn;//成品料号
        private String bydpn;//
        private String factory;
        private Integer level;

        public String getProductPn() {
            return productPn;
        }

        public void setProductPn(String productPn) {
            this.productPn = productPn;
        }

        public String getBydpn() {
            return bydpn;
        }

        public void setBydpn(String bydpn) {
            this.bydpn = bydpn;
        }

        public String getFactory() {
            return factory;
        }

        public void setFactory(String factory) {
            this.factory = factory;
        }

        public Integer getLevel() {
            return level;
        }

        public void setLevel(Integer level) {
            this.level = level;
        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ymcaptain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值