美文网首页
list转不限层级的tree

list转不限层级的tree

作者: 更真实 | 来源:发表于2019-10-09 16:02 被阅读0次

    效果

    根节点 子节点

    数据结构

    数据结构
    • childrens 存放直接子节点
    • childrenIds 存放子节点的ID以及子节点下的节点的ID

    实体

    public class Org implements Serializable{
        private static final long serialVersionUID = -3558400362241449714L;
        @JsonProperty("key")
        private int id;
        private int parentId;
        @JsonIgnore
        private Org parentOrg;
        private String code;
        @JsonProperty("title")
        private String name;
        private int order;
        private List<Integer> childrenIds;// 存放子节点ID,以及子节点的下层节点ID
        @JsonProperty("children")
        private List<Org> childrens;// 存放直接子节点实体
        private Date createtime;
        private String createBy;
        private Date modifyTime;
        private String modifyBy;
        
        
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public int getParentId() {
            return parentId;
        }
        public void setParentId(int parentId) {
            this.parentId = parentId;
        }
        
        public Org getParentOrg() {
            return parentOrg;
        }
        public void setParentOrg(Org parentOrg) {
            this.parentOrg = parentOrg;
        }
        public String getCode() {
            return code;
        }
        public void setCode(String code) {
            this.code = code;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
        public List<Integer> getChildrenIds() {
            return childrenIds;
        }
        public void setChildrenIds(List<Integer> childrenIds) {
            this.childrenIds = childrenIds;
        }
        public List<Org> getChildrens() {
            return childrens;
        }
        public void setChildrens(List<Org> childrens) {
            this.childrens = childrens;
        }
        public Date getCreatetime() {
            return createtime;
        }
        public void setCreatetime(Date createtime) {
            this.createtime = createtime;
        }
        public String getCreateBy() {
            return createBy;
        }
        public void setCreateBy(String createBy) {
            this.createBy = createBy;
        }
        public Date getModifyTime() {
            return modifyTime;
        }
        public void setModifyTime(Date modifyTime) {
            this.modifyTime = modifyTime;
        }
        public String getModifyBy() {
            return modifyBy;
        }
        public void setModifyBy(String modifyBy) {
            this.modifyBy = modifyBy;
        }
        public int getOrder() {
            return order;
        }
        public void setOrder(int order) {
            this.order = order;
        }
        /**
         * 添加子节点
         * @param org
         */
        public void addChildren(Org org) {
            if(this.childrens==null) {
                this.childrens=new ArrayList<Org>();
            }
            this.addChildrenId(org.getId());
            this.childrens.add(org);
        }
        /**
         * 添加ID到子节点ID集合,如果此节点存在父节点则把ID添加到父节点的子节点ID集合
         * @param id
         */
        private void addChildrenId(int id) {
            if(this.childrenIds==null) {
                this.childrenIds=new ArrayList<Integer>();
            }
            if(this.parentOrg!=null) {
                this.parentOrg.addChildrenId(id);
            }
            this.childrenIds.add(id);
        }
        public Org() {
            super();
        }
        @Override
        public String toString() {
            return "Org [id=" + id + ", parentId=" + parentId + ", code=" + code + ", name=" + name + ", order=" + order
                    + ", createtime=" + createtime + ", createBy=" + createBy + ", modifyTime=" + modifyTime + ", modifyBy="
                    + modifyBy + "]";
        }
        
    }
    

    list转tree

    @Service
    public class OrgServiceImpl implements OrgService{
        @Autowired
        private OrgMapper orgMapper;
        public List<Map<String, Object>> query(int pid){
            return null;
        }
        @Override
        public Org add(Org org) throws Exception {
            return orgMapper.add(org);
        }
        @Override
        public List<Org> queryAll() {
            List<Org> orgs=orgMapper.queryAll();
            Map<Integer, Org> tree=createTree(orgs);
            return new ArrayList<Org>(tree.values());
        }
        
    
        /**
         * 生成树
         * @return
         */
        private Map<Integer, Org> createTree(List<Org> orgs) {
            Map<Integer, Org> matched=new HashMap<>();// 存放已添加到树中的节点
            List<Org> unmatched=orgs;// 存放未添加到树中的节点
            Map<Integer, Org> tree=new HashMap<>();// 存放根节点,
            addRoot(unmatched,tree,matched);
            int preProcessCount=unmatched.size();
            int processedCount=0;
            while(preProcessCount>processedCount) {
                preProcessCount=unmatched.size();
                unmatched=addNode(unmatched,matched);
                processedCount=unmatched.size();
            }
            return tree;
        }
        /**
         * 添加节点到根
         * @param orgs
         */
        private void addRoot(List<Org> orgs,Map<Integer, Org> tree,Map<Integer, Org> matched) {
            for(Org org:orgs) {
                if(isRoot(org)) {
                    tree.put(org.getId(), org);
                    matched.put(org.getId(), org);
                }
            }
        }
        /**
         * 添加节点到树
         * @param unmatched 未存在树中的节点
         * @param matched 节点已存在树中
         * @return
         */
        private List<Org> addNode(List<Org> unmatched,Map<Integer, Org> matched) {
            List<Org> temp=new ArrayList<>();
            for(Org org : unmatched) {
                if(matched.containsKey(org.getParentId())) {
                    Org parent=matched.get(org.getParentId());
                    org.setParentOrg(parent);
                    parent.addChildren(org);
                    matched.put(org.getId(), org);
                }else {
                    temp.add(org);
                }
            }
            return temp;
        }
        /**
         * 是否为根节点
         * @param org
         * @return
         */
        private boolean isRoot(Org org) {
            return org.getParentId()<=0;
        }
        
    }
    
    

    相关文章

      网友评论

          本文标题:list转不限层级的tree

          本文链接:https://www.haomeiwen.com/subject/owlgpctx.html