原始数据
[
{
"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;
public class ProductPnGroupByLevelTest {
public static void main(String[] args) {
System.out.println("-------start----------");
calcFormLevel1();
}
public static void calcFormLevel1() {
Map<Integer, List<DataObject>> levelMap = getDataMap();
Integer minLevel = 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("-----------循环结束------------");
}
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();
if(level>maxLevel) return resultMap;
Map<Integer, List<DataObject>> productPnMap_1 = resultMap.get(productPn);
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);
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;
}
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;
}
}
}