或者参考这里:https://blog.csdn.net/ynfumingzheng/article/details/79908757
我项目中的代码:
核心代码如下
// 这个对象各个层级的product都是平铺的,里面child都是null,
List<ImsDailyProductDTO > products = ......
//调用,把平铺的集合转换成child格式的对象
ImsDailyProductDTO imsDailyProductDTO = converChildStructure(products);
//converChildStructure方法
private ImsDailyProductDTO converChildStructure(List<ImsDailyProductDTO > products){
ImsDailyProductDTO imsDailyProductDTO = new ImsDailyProductDTO ();
for(ImsDailyProductDTO product :products){
if(product.getPlanCode().equals("00")){
//遍历找到跟节点对象product,00表示全产品
//把平铺的list,组装成child格式
result = getChild(product,products);
}
}
}
//getChild 递归调用,就是自己调自己
private ImsDailyProductDTO getChild (ImsDailyProductDTO imsDailyProductDTO ,List<ImsDailyProductDTO > products){
for(ImsDailyProductDTO product :products){
//遍历根节点的code等于其他的parentCode.则这个对象是根节点的child
if(imsDailyProductDTO.getPlanCode().equals(product.getPlanParentCode())){
//因为child可能为null,为了防止空指针异常,为null是。new一个集合,把他的子集add到这个集合中
if(CollectionUtils.isEmpty(imsDailyProductDTO.getChild())){
//(我这里一不小心报了个bug)这里一定要new Arraylist<>(Arrays.asList(product)),
//直接Arrays.asList(product)的集合不能用add方法!!
ImsDailyProductDTO.setChild(new Arraylist<>(Arrays.asList(product)));
}else{
//不为空就get到这个集合,往里面add
ImsDailyProductDTO.getChild().add(product);
}
// 递归调用
//比如现在是第一次调用,这个product就是全产品的下一层,做为参数继续找他的下一级
getChild(product.products);
}
}
return imsDailyProductDTO;
}