树形遍历,从最末节点到最上层节点的实现

该文章描述了一个名为SysTypeVO的类,用于处理系统的分类数据,包括类型ID、父ID、层级和子类型。主要介绍了如何获取并按照层级和排序规则整理分类ID的方法,适用于IT技术中的数据组织和管理。
摘要由CSDN通过智能技术生成

如下:1、10 为一级类别(职称/行业),2、5、8、11 为二级类别,3、4、6、7、9、12 为三级类别

需要的结果为:3,4,6,7,9,2,5,8,12, 11, 10

package com.zjtx.model.vo;

import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 系统分类
 * 2020/4/27 0027 下午 15:47
 */
public class SysTypeVO {
    private Integer typeId;
    private Integer id;
    private Integer pid;
    private Integer lev;
    private String name;
    private List<SysTypeVO> child;

    public Integer getTypeId() {
        return typeId;
    }

    public SysTypeVO setTypeId(Integer typeId) {
        this.typeId = typeId;
        return this;
    }

    public Integer getId() {
        return id;
    }

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

    public Integer getPid() {
        return pid;
    }

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

    public Integer getLev() {
        return lev;
    }

    public SysTypeVO setLev(Integer lev) {
        this.lev = lev;
        return this;
    }

    public String getName() {
        return name;
    }

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

    public List<SysTypeVO> getChild() {
        return child;
    }

    public SysTypeVO setChild(List<SysTypeVO> child) {
        this.child = child;
        return this;
    }

    /**
     * 按不同层级得到集合
     * @param levMap
     * @param node
     */
    public static void getChildren(Map<String, List<Integer>> levMap, SysTypeVO node) {
        if (!CollectionUtils.isEmpty(node.getChild())) {
            levMap.put(node.getLev() + "." + node.getId(), node.getChild().stream().map(SysTypeVO::getTypeId).collect(Collectors.toList()));
            for (SysTypeVO node1 : node.getChild()) {
                getChildren(levMap, node1);
            }
        }
    }

    /**
     * 获取排序  3、2、1
     * @param sysTypeVOS
     * @return
     */
    public static List<Integer> getSortTypeIds(List<SysTypeVO> sysTypeVOS){
        List<Integer> toIds = new ArrayList<>();
        if(CollectionUtils.isEmpty(sysTypeVOS))
            return toIds;

        List<SysTypeVO> nodeList = new ArrayList<>();
        for (SysTypeVO node1 : sysTypeVOS) {
            boolean mark = false;
            for (SysTypeVO node2 : sysTypeVOS) {
                if (node1.getPid() != null && node1.getPid().equals(node2.getTypeId())) {
                    mark = true;
                    if (node2.getChild() == null)
                        node2.setChild(new ArrayList<SysTypeVO>());
                    node2.getChild().add(node1);
                    break;
                }
            }
            if (!mark) {
                nodeList.add(node1);
            }
        }
        List<SysTypeVO> lev1NodeList = nodeList.stream().filter(o->{
            return o.getLev().equals(1);
        }).collect(Collectors.toList());

        //类别有误 -- 没有找到1级
        if(CollectionUtils.isEmpty(lev1NodeList)){
            return toIds;
        }
        Map<String, List<Integer>> levMap = new HashMap<>();

        for (SysTypeVO sysTypeVO : lev1NodeList) {
            levMap.clear();
            getChildren(levMap, sysTypeVO);

            if(CollectionUtils.isEmpty(levMap)){
                continue;
            }
            //--------------------
            // 从 1.1 2.2 2.5 变成  2.2 2.5 1.1 顺序
            List<String> sortKeys = new ArrayList<>();
            List<String> keys = new ArrayList<>(levMap.keySet());
            String lev1Key = "";
            for (String key : keys) {
                if (key.startsWith("1.")) {
                    lev1Key = key;
                    continue;
                }
                sortKeys.add(key);
            }
            sortKeys.add(lev1Key);
            //----------------------------------
            for (String lev1 : sortKeys) {
                List<Integer> ids =  levMap.get(lev1);
                toIds.addAll(ids);
            }
            toIds.add(sysTypeVO.getTypeId()); // 1 级 id
            levMap.clear();
        }
        return toIds;
    }

    public static void main(String[] args) {
        List<SysTypeVO> sysTypeVOS = new ArrayList<>();
        sysTypeVOS.add(new SysTypeVO().setId(1).setTypeId(1).setLev(1).setPid(0));
        sysTypeVOS.add(new SysTypeVO().setId(2).setTypeId(2).setLev(2).setPid(1));
        sysTypeVOS.add(new SysTypeVO().setId(3).setTypeId(3).setLev(3).setPid(2));
        sysTypeVOS.add(new SysTypeVO().setId(4).setTypeId(4).setLev(3).setPid(2));
        sysTypeVOS.add(new SysTypeVO().setId(5).setTypeId(5).setLev(2).setPid(1));
        sysTypeVOS.add(new SysTypeVO().setId(6).setTypeId(6).setLev(3).setPid(5));

        sysTypeVOS.add(new SysTypeVO().setId(7).setTypeId(7).setLev(1).setPid(0));
        sysTypeVOS.add(new SysTypeVO().setId(8).setTypeId(8).setLev(2).setPid(7));
        sysTypeVOS.add(new SysTypeVO().setId(9).setTypeId(9).setLev(3).setPid(8));

        List<Integer> toIds = getSortTypeIds(sysTypeVOS);
        //levMap.put("0", lev1Ids);
        System.out.println(toIds); //[6, 4, 3, 5, 2, 1, 9, 8, 7]

        sysTypeVOS.clear();
        sysTypeVOS.add(new SysTypeVO().setId(211960).setTypeId(312).setLev(1).setPid(0));
        sysTypeVOS.add(new SysTypeVO().setId(211961).setTypeId(373).setLev(2).setPid(312));
        sysTypeVOS.add(new SysTypeVO().setId(211962).setTypeId(390).setLev(3).setPid(373));


        toIds = getSortTypeIds(sysTypeVOS);
        //levMap.put("0", lev1Ids);
        System.out.println(toIds); //[6, 4, 3, 5, 2, 1, 9, 8, 7]
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

林中山野

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值