【java】树结构数据组装

import io.jsonwebtoken.lang.Collections;
import lombok.Data;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @Description 封装树
 */
public class BuildTree{
    public static void main(String[] args) {
        CategoryVO categoryVO1 = new CategoryVO();
        categoryVO1.setName("分类1");
        categoryVO1.setParentId(null);
        categoryVO1.setId("1");

        CategoryVO categoryVO2 = new CategoryVO();
        categoryVO2.setName("分类1-1");
        categoryVO2.setParentId("1");
        categoryVO2.setId("2");

        CategoryVO categoryVO3 = new CategoryVO();
        categoryVO3.setName("分类1-1-1");
        categoryVO3.setParentId("2");
        categoryVO3.setId("3");
        
        List<CategoryVO> list = new ArrayList<>();
        list.add(categoryVO1);
        list.add(categoryVO2);
        list.add(categoryVO3);

        List<CategoryVO> tree1 = getTree(list);
        List<CategoryVO> tree2 = getRootTree(list);
        System.out.println(tree1.size());
        System.out.println(tree2.size());
    }

    /**
     * 递归方法
     */
    public static List<CategoryVO> getTree(List<CategoryVO> list, String parentId){
        List<CategoryVO> treeList = new ArrayList<>();
        for(CategoryVO categoryVO : list){
            if(parentId.equals(categoryVO.getParentId())){
                categoryVO.setChildren(getTree(list, categoryVO.getId()));
                treeList.add(categoryVO);
            }
        }
        return treeList;
    }
	/**
	*  获取根数据
	*/
    public static List<CategoryVO> getRootTree(List<CategoryVO> list){
        if(Collections.isEmpty(list)){
            return new ArrayList<>();
        }
        LinkedList<CategoryVO> l = new LinkedList<>();
        l.addAll(list);
        Iterator<CategoryVO> iterator = l.iterator();
        while(iterator.hasNext()){
            CategoryVO categoryVO = iterator.next();
            if(categoryVO.getParentId() != null){
                iterator.remove();
                continue;
            }
            categoryVO.setChildren(getTree(list, categoryVO.getId()));
        }
        return l;
    }

    /**
     * 按parentId取
     */
    public static List<CategoryVO> getTree(List<CategoryVO> list){
        if(Collections.isEmpty(list)){
            return new ArrayList<>();
        }
        LinkedList<CategoryVO> linkedList = new LinkedList<>();
        Map<String, List<CategoryVO>> map = list.stream().collect(Collectors.groupingBy(item -> item.getParentId() != null ? item.getParentId() : "noParent"));
        // 存放所有id
        Set<String> idSet = new HashSet<>();
        for (CategoryVO categoryVO : list) {
            if(categoryVO.getParentId() != null){
                idSet.add(categoryVO.getParentId());
            }
            linkedList.add(categoryVO);
        }
        Iterator<CategoryVO> iterator = linkedList.iterator();
        CategoryVO categoryVO;
        while(iterator.hasNext()){
            categoryVO = iterator.next();
            categoryVO.setChildren(map.get(categoryVO.getId()));
            if(idSet.contains(categoryVO.getParentId())){
                iterator.remove();
            }
        }
        return linkedList;
    }
}
@Data
class Category {
    private String name;
    private String id;
    private String parentId;
}
@Data
class CategoryVO extends Category{
    private List<CategoryVO> children;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

王佑辉

老板,赏点吧

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

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

打赏作者

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

抵扣说明:

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

余额充值