利用Map将一个数组 组装 树

  1. 这是一个简单的利用HashMap将一个数组组装成一棵树的代码 可能有多个根节点
  2. 核心发放为createTree 输入参数分别为 对象数组,id get方法,pid get方法 使其能兼容数据类型。不需要指定特定的成员信息
  3. 节点对象除了保存对象信息,只保留了上级节点信息和子节点列表信息。
  4. 如果有什么不适用的状况欢迎提出
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

//根节点的pid为null  可能有多个
public class TreeUtils {
    public static <T> List<TreeNode<T>> createTree(List<T> dataList, Function<T,Number> idGet, Function<T,? extends Number> pidGet) {
        Map<Number, TreeNode<T>> idMapper = new HashMap<>();
        for (T node : dataList) {
            Number id = idGet.apply(node);
            TreeNode<T> tTreeNode = new TreeNode<>(node);
            idMapper.put(id, tTreeNode);
        }
        for (TreeNode<T> currentNode : idMapper.values()) {
            Number pid = pidGet.apply(currentNode.getData());
            if (pid != null && idMapper.containsKey(pid)) {
                TreeNode<T> pNode = idMapper.get(pid);
                pNode.addChild(currentNode);
                currentNode.setParentNode(pNode);
            }
        }
        List<TreeNode<T>> collect = idMapper.values().stream().filter((o) -> o.getParentNode() == null).collect(Collectors.toList());
        return collect;
    }

    public static void main(String[] args) {
        ArrayList<TreeBaseEntity> list = new ArrayList();
        list.add(new TreeBaseEntity(1L, "", 0L));
        list.add(new TreeBaseEntity(2L, "", 0L));
        list.add(new TreeBaseEntity(3L, "", 0L));
        list.add(new TreeBaseEntity(4L, "", 3L));
        list.add(new TreeBaseEntity(5L, "", 4L));
        list.add(new TreeBaseEntity(6L, "", 5L));
        list.add(new TreeBaseEntity(7L, "", 3L));
        list.add(new TreeBaseEntity(8L, "", 4L));
        list.add(new TreeBaseEntity(9L, "", 5L));
        List<TreeNode<TreeBaseEntity>> tree = TreeUtils.createTree(list, TreeBaseEntity::getId, TreeBaseEntity::getQuoteId);
        System.out.println("finish");
    }

    public static class TreeNode<T> {
        private TreeNode<T> parentNode;
        private List<TreeNode<T>> nodes = new ArrayList<>();
        private T data;

        public TreeNode(T data) {
            this.data = data;
        }

        public void addChild(TreeNode<T> node) {
            nodes.add(node);
        }

        public TreeNode() {
        }

        public TreeNode<T> getParentNode() {
            return parentNode;
        }

        public void setParentNode(TreeNode<T> parentNode) {
            this.parentNode = parentNode;
        }

        public List<TreeNode<T>> getNodes() {
            return nodes;
        }

        public void setNodes(List<TreeNode<T>> nodes) {
            this.nodes = nodes;
        }

        public T getData() {
            return data;
        }

        public void setData(T data) {
            this.data = data;
        }
    }

    public static class TreeBaseEntity {

        private Long id;
        private String code;
        /**
         * name
         */
        private String text;
        /**
         * parentId
         */
        private Long quoteId;

        public TreeBaseEntity() {
        }

        public TreeBaseEntity(Long id, String text, Long quoteId) {
            super();
            this.id = id;
            this.text = text;
            this.quoteId = quoteId;
        }

        public Long getId() {
            return id;
        }

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

        public Long getQuoteId() {
            return quoteId;
        }

        public void setQuoteId(Long quoteId) {
            this.quoteId = quoteId;
        }

        public String getCode() {
            return code;
        }

        public void setCode(String code) {
            this.code = code;
        }

        public String getText() {
            return text;
        }

        public void setText(String text) {
            this.text = text;
        }

    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值