通过随机节点构造完整树路径

134 阅读3分钟
/**
 * 填充类目树
 * 例:
 * 1. 一级类目 A0-1、B0-1、C0-1
 * 2. 二级类目 A1-1、A1-2、B1-1、B1-2、C1-1、C1-2
 * 3. 三级类目 A2-1、A2-2、A2-3、A2-4、B2-1、B2-2、B2-3、B2-4、C2-1、C2-2、C2-3、C2-4
 * 4. 四级类目 A3-1、A3-2、A3-3、A3-4、A3-5、A3-6、A3-7、A3-8、B3-1、B3-2、B3-3、B3-4、B3-5、B3-6、B3-7、B3-8、C3-1、C3-2、C3-3、C3-4、C3-5、C3-6、C3-7、C3-8
 *
 * 获取 A3-1, A3-4, B3-3, B2-3, C3-8
 * result = []
 * slotMap = []
 * queue = [A3-1, A3-4, B3-3, B2-3, C3-8]
 *
 * queue.index = 0
 * node = A3-1, parent = A2-1
 * slotMap = [A2-1]
 * queue = [A3-1, A3-4, B3-3, B2-3, C3-8, A2-1]

 * queue.index = 1
 * node = A3-4, parent = A2-2
 * slotMap = [A2-1, A2-2]
 * queue = [A3-1, A3-4, B3-3, B2-3, C3-8, A2-1, A2-2]

 * queue.index = 2
 * node = B3-3, parent = B2-2
 * slotMap = [A2-1, A2-2, B2-2]
 * queue = [A3-1, A3-4, B3-3, B2-3, C3-8, A2-1, A2-2, B2-2]

 * queue.index = 3
 * node = B2-3, parent = B1-2
 * slotMap = [A2-1, A2-2, B2-2, B1-2]
 * queue = [A3-1, A3-4, B3-3, B2-3, C3-8, A2-1, A2-2, B2-2, B1-2]

 * queue.index = 4
 * node = C3-8, parent = C2-4
 * slotMap = [A2-1, A2-2, B2-2, B1-2, C2-4]
 * queue = [A3-1, A3-4, B3-3, B2-3, C3-8, A2-1, A2-2, B2-2, B1-2, C2-4]

 * queue.index = 5
 * node = A2-1, parent = A1-1
 * slotMap = [A2-1, A2-2, B2-2, B1-2, C2-4, A1-1]
 * queue = [A3-1, A3-4, B3-3, B2-3, C3-8, A2-1, A2-2, B2-2, B1-2, C2-4, A1-1]

 * queue.index = 6
 * node = A2-2, parent = A1-1
 * slotMap = [A2-1, A2-2, B2-2, B1-2, C2-4, A1-1]
 * queue = [A3-1, A3-4, B3-3, B2-3, C3-8, A2-1, A2-2, B2-2, B1-2, C2-4, A1-1]

 * queue.index = 7
 * node = B2-2, parent = B1-1
 * slotMap = [A2-1, A2-2, B2-2, B1-2, C2-4, A1-1, B1-1]
 * queue = [A3-1, A3-4, B3-3, B2-3, C3-8, A2-1, A2-2, B2-2, B1-2, C2-4, A1-1]

 * queue.index = 8
 * node = B1-2, parent = 0
 * slotMap = [A2-1, A2-2, B2-2, B1-2, C2-4, A1-1, B1-1, 0]
 * queue = [A3-1, A3-4, B3-3, B2-3, C3-8, A2-1, A2-2, B2-2, B1-2, C2-4, A1-1]

 * queue.index = 9
 * node = C2-4, parent = C1-2
 * slotMap = [A2-1, A2-2, B2-2, B1-2, C2-4, A1-1, B1-1, 0, C1-2]
 * queue = [A3-1, A3-4, B3-3, B2-3, C3-8, A2-1, A2-2, B2-2, B1-2, C2-4, A1-1, B1-1, C1-2]

 * queue.index = 10
 * node = A1-1, parent = 0
 * slotMap = [A2-1, A2-2, B2-2, B1-2, C2-4, A1-1, B1-1, 0, C1-2]
 * queue = [A3-1, A3-4, B3-3, B2-3, C3-8, A2-1, A2-2, B2-2, B1-2, C2-4, A1-1, B1-1, C1-2]

 * queue.index = 11
 * node = B1-1, parent = 0
 * slotMap = [A2-1, A2-2, B2-2, B1-2, C2-4, A1-1, B1-1, 0, C1-2]
 * queue = [A3-1, A3-4, B3-3, B2-3, C3-8, A2-1, A2-2, B2-2, B1-2, C2-4, A1-1, B1-1, C1-2]

 * queue.index = 12
 * node = C1-1, parent = 0
 * slotMap = [A2-1, A2-2, B2-2, B1-2, C2-4, A1-1, B1-1, 0, C1-2]
 * queue = [A3-1, A3-4, B3-3, B2-3, C3-8, A2-1, A2-2, B2-2, B1-2, C2-4, A1-1, B1-1, C1-2]
 *
 * @param reqData
 * @return
 */
@Override
public List<CategoryTreeVO> queryCategoryGroupTree(CategoryGroupTreeReqData reqData){
    List<RemCategoryPO> remCategoryPOList = easyCategoryRemMapper.getListEnable(reqData);
    List<CategoryTreeVO> queue = BeanConvertUtils.convertList(remCategoryPOList, CategoryTreeVO.class).stream()
            .collect(Collectors.toMap(CategoryTreeVO::getCategoryId, Function.identity(), (f, s) -> s)).values()
            .stream().collect(Collectors.toList());
    Map<Long, CategoryTreeVO> slotMap = queue.stream()
            .collect(Collectors.toMap(CategoryTreeVO::getCategoryId, Function.identity(), (f, s) -> s));

    for(int i = 0; i < queue.size(); i++){
        CategoryTreeVO node = queue.get(i);
        Long pid = node.getParentCategoryId();
        if(Objects.isNull(pid)){
            continue;
        }

        CategoryTreeVO parentNode = slotMap.computeIfAbsent(pid,
                key -> {
                    CategoryTreeVO item = Objects.equals(0L, key) ? new CategoryTreeVO() :
                            BeanConvertUtils.convert(easyCategoryRemMapper.getByCategoryId(key),
                                    CategoryTreeVO.class);
                    queue.add(item);
                    return item;
                });

        List<CategoryTreeVO> children = Optional.ofNullable(parentNode.getChildCategoryList())
                .orElse(new ArrayList<>());
        children.add(node);
        parentNode.setChildCategoryList(children);
    }
    List<CategoryTreeVO> resultTree = slotMap.get(0L).getChildCategoryList();
    return resultTree;
}