将list集合封装成一个树形结构

将list集合封装成一个树形结构

一般在项目中获取类型列表,应该是一个树形结构的数据

数据库表对应的实体类

/**
 * XX类型
 */
public class ModelType {
    private Integer id;
    private String name;
    private Integer pid;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getPid() {
        return pid;
    }

    public void setPid(Integer pid) {
        this.pid = pid;
    }

    public ModelType() {
    }

    public ModelType(Integer id, String name, Integer pid) {
        this.id = id;
        this.name = name;
        this.pid = pid;
    }

    @Override
    public String toString() {
        return "ModelType{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pid=" + pid +
                '}';
    }
}

继承此实体类

public class ModelTypeVo extends ModelType {
    private List<ModelTypeVo> children;

    public List<ModelTypeVo> getChildren() {
        return children;
    }

    public void setChildren(List<ModelTypeVo> children) {
        this.children = children;
    }

    @Override
    public String toString() {
        return "ModelTypeVo{" +
                "children=" + children +
                '}';
    }
}

测试及封装方法

public class ToTree {
    public static void main(String[] args) {
        List<ModelType> list = new ArrayList<>();
        list.add(new ModelType(1, "数码", null));
        list.add(new ModelType(2, "键盘", 1));
        list.add(new ModelType(3, "机械键盘", 2));
        list.add(new ModelType(4, "薄膜键盘", 2));
        list.add(new ModelType(5, "主题键盘", 2));
        list.add(new ModelType(6, "鼠标", 1));
        list.add(new ModelType(7, "有线鼠标", 6));
        list.add(new ModelType(8, "无线鼠标", 6));
        list.add(new ModelType(9, "手机", null));
        list.add(new ModelType(10, "小米", 9));
        list.add(new ModelType(11, "华为", 9));
        list.add(new ModelType(12, "红米", 10));
        list.add(new ModelType(13, "荣耀", 11));
        list.add(new ModelType(14, "畅想", 11));
        List<ModelTypeVo> modelTypeVos = toTree(list);
    }

    /**
     * 将list集合封装成树形结构数据
     * @param list
     * @return
     */
    static List<ModelTypeVo> toTree(List<ModelType> list) {
        //创建一个map用于存放 <类型id,将类型对象封装成的 ModelTypeVo 对象>
        HashMap<Integer, ModelTypeVo> map = new HashMap<>();
        List<ModelTypeVo> trees = new ArrayList<>();
        list.stream()
                .peek(type -> {
                    ModelTypeVo node = new ModelTypeVo();
                    node.setId(type.getId());
                    node.setName(type.getName());
                    node.setPid(type.getPid());
                    map.put(type.getId(), node);
                })
                .forEach(type -> {
                    Integer pid = type.getPid();
                    Integer id = type.getId();
                    ModelTypeVo pNode = map.get(pid);
                    ModelTypeVo cNode = map.get(id);
                    //判断map是否存在此pid
                    if (map.containsKey(pid)) {
                        //存在,则将该pid的子节点取出来
                        List<ModelTypeVo> children = pNode.getChildren();
                        if (children == null) { //如果子节点为空,初始化子节点
                            children = new ArrayList<>();
                            pNode.setChildren(children);
                        }
                        //将此子节点放入对应父节点下
                        children.add(cNode);
                    } else {
                        trees.add(cNode);
                    }
                });
        return trees;
    }
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值