list转为tree

记录一段代码,用于实现将父子关系list转为tree

/**
* @author: yc
* @des: 名称、id 通用VO
* @date: 2022/5/25 15:24
*/
@Data
public class NameIdVO {

    private String id;

    private String name;

}
/**
* @author: yc
* @des:  通用联动VO
* @date: 2022/5/25 16:40
*/
@Data
public class LinkVO {

    @ApiModelProperty("名称、id")
    private NameIdVO nameId;

    @ApiModelProperty("子级List")
    private List<LinkVO> childList;
}
    public void list2tree(){
        // 树深度
        Integer treeDeep = 3;
        // 累加值
        Integer count = 1;
        List<LinkVO> tree = new ArrayList<>();
        List<AppLszsChainDimDO> baseList = chainDimMapper.selectList(new QueryWrapper<AppLszsChainDimDO>().lambda().eq(AppLszsChainDimDO::getVersionFlag, 1));
        // 将根节点单独拿出来
        List<AppLszsChainDimDO> rootList = baseList.stream().filter(i -> StringUtils.isBlank(i.getParentcode())).collect(Collectors.toList());
        List<String> rootIdList = rootList.stream().map(i -> i.getChainId()).collect(Collectors.toList());
        // baseList中移除根节点 再分组
        baseList = baseList.stream().filter(i -> !rootIdList.contains(i.getChainId())).collect(Collectors.toList());
        Map<String, List<AppLszsChainDimDO>> map = baseList.stream().collect(Collectors.groupingBy(i -> i.getParentcode()));
        for(AppLszsChainDimDO root : rootList){
            LinkVO node = new LinkVO();
            NameIdVO nameIdVO = new NameIdVO();
            nameIdVO.setId(root.getChainId());
            nameIdVO.setName(root.getChainName());
            node.setNameId(nameIdVO);
            node.setChildList(new ArrayList<>());
            setChild(map,node,treeDeep,count);
            tree.add(node);
        }
        System.out.println(JSON.toJSONString(tree));
    }
    public void setChild(Map<String, List<AppLszsChainDimDO>> baseMap,LinkVO parent,Integer treeDeep,Integer count){
        List<AppLszsChainDimDO> childList = baseMap.get(parent.getNameId().getId());
        if((count++) > treeDeep){
            return;
        }
        if(null != childList){
            parent.setChildList(childList.stream().map(i -> {
                LinkVO childVO = new LinkVO();
                NameIdVO nameIdVO = new NameIdVO();
                nameIdVO.setId(i.getChainId());
                nameIdVO.setName(i.getChainName());
                childVO.setNameId(nameIdVO);
                childVO.setChildList(new ArrayList<>());
                return childVO;
            }).collect(Collectors.toList()));
            for(LinkVO parentVO : parent.getChildList()){
                setChild(baseMap,parentVO,treeDeep,count);
            }
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的List转为多个树的过程可以通过以下方法来实现: 1. 首先,我们需要定义一个树节点的类,包含节点的值以及子节点列表,例如: ``` public class TreeNode { private int value; private List<TreeNode> children; public TreeNode(int value) { this.value = value; children = new ArrayList<>(); } // getter和setter方法 } ``` 2. 接下来,我们需要编写一个方法来将List转为多个树,例如: ``` public List<TreeNode> convertListToTrees(List<Integer> list) { List<TreeNode> trees = new ArrayList<>(); Map<Integer, TreeNode> nodeMap = new HashMap<>(); // 先创建树节点并将其放入映射表中 for (Integer value : list) { TreeNode node = new TreeNode(value); nodeMap.put(value, node); } // 构建树结构 for (Integer value : list) { TreeNode node = nodeMap.get(value); // 如果当前节点有父节点,则将其添加到父节点的子节点列表中 if (nodeMap.containsKey(value - 1)) { TreeNode parent = nodeMap.get(value - 1); parent.getChildren().add(node); } else { // 否则,当前节点为根节点,直接添加到多个树列表中 trees.add(node); } } return trees; } ``` 3. 最后,我们可以通过调用上述方法来将List转为多个树,例如: ``` List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); List<TreeNode> trees = convertListToTrees(list); // 遍历多个树,并输出每个树的结构 for (TreeNode tree : trees) { printTree(tree); } ``` 注意:上述方法假设输入的List中的节点值是连续的整数,并且根节点的值为1,父节点的值比其子节点小1,子节点的值比其父节点大1。如果输入的List不满足这些条件,则需要进行相应的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值