我是靠谱客的博主 跳跃羊,最近开发中收集的这篇文章主要介绍java使用泛型实现树形java使用泛型实现树形一、树形的基本配置二、树形构造三、树形实体类四、测试,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

java使用泛型实现树形

本文大纲
一、树形的基本配置
二、树形构造
三、树形实体类
四、测试

一、树形的基本配置

package com.tree;

import java.util.List;

/**
 * 树形结构的基本配置
 *
 * @param <T> 列表
 */
public class TreeBase<T> {
    private Number id;

    private Number parentId;

    private List<T> children;


    public Number getId() {
        return id;
    }

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

    public Number getParentId() {
        return parentId;
    }

    public void setParentId(Number parentId) {
        this.parentId = parentId;
    }

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

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


二、树形构造

package com.tree;

import java.util.ArrayList;
import java.util.List;

/**
 * 构造树形结构
 *
 * @param <T> 树形基本配置
 * @param <U> 树形根节点值
 */
public class TreeBulider<T extends TreeBase<T>, U> {
    // 列表
    private final List<T> list;
    // 根节点值
    private final U root;

    public TreeBulider(List<T> list, U root) {
        this.list = list;
        this.root = root;
    }

    /**
     * 建立树形结构
     *
     * @return
     */
    public List<T> buildTree() {
        if (root == null) {
            throw new RuntimeException("根值不能为空");
        }
        if (list == null || list.isEmpty()) {
            return new ArrayList<>();
        }
        List<T> tree = new ArrayList<>();
        List<T> rootNode = this.getRootNode();
        for (T operateNode : rootNode) {
            buildChildTree(operateNode);
            tree.add(operateNode);
        }
        return tree;
    }

    /**
     * 递归,建立子树形结构
     *
     * @param parentNode 父节点
     * @return
     */
    private T buildChildTree(T parentNode) {
        List<T> childMenus = new ArrayList<>();
        for (T menuNode : list) {
            if (menuNode.getParentId().equals(parentNode.getId())) {
                childMenus.add(buildChildTree(menuNode));
            }
        }
        parentNode.setChildren(childMenus);
        return parentNode;
    }

    /**
     * 获取根节点
     *
     * @return
     */
    private List<T> getRootNode() {
        List<T> rootMenuLists = new ArrayList<>();
        for (T menuNode : list) {
            // 找出根节点
            if (menuNode.getParentId().equals(root)) {
                rootMenuLists.add(menuNode);
            }
        }
        return rootMenuLists;
    }

}

三、树形实体类

继承TreeBase

package com.tree;

/**
 * 树形实体类
 */
public class Operate extends TreeBase {

    private String name;

    public String getName() {
        return name;
    }

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

四、测试

package com.tree;

import com.alibaba.fastjson.JSON;

import java.util.ArrayList;
import java.util.List;

public class TreeTest {

    public static void main(String[] args) {
        // 获取数据源
        List<Operate> list = list();

        List<Operate> operateTree1 = new TreeBulider<>(list,0L).buildTree();
        System.out.println(JSON.toJSONString(operateTree1));

        List<Operate> operateTree2 = new TreeBulider<>(list,0).buildTree();
        System.out.println(JSON.toJSONString(operateTree2));
    }


    // 模拟数据
    public static List<Operate> list() {
        List<Operate> operateList = new ArrayList<>();

        Operate operate10 = new Operate();
        operate10.setId(1L);
        operate10.setParentId(0L);
        operate10.setName("根目录1");

        operateList.add(operate10);

        Operate operate11 = new Operate();
        operate11.setId(11L);
        operate11.setParentId(1L);
        operate11.setName("子目录11");

        Operate operate12 = new Operate();
        operate12.setId(12L);
        operate12.setParentId(1L);
        operate12.setName("子目录12");

        operateList.add(operate11);
        operateList.add(operate12);


        Operate operate20 = new Operate();
        operate20.setId(2L);
        operate20.setParentId(0L);
        operate20.setName("根目录2");

        operateList.add(operate20);

        Operate operate21 = new Operate();
        operate21.setId(21L);
        operate21.setParentId(2L);
        operate21.setName("子目录21");

        Operate operate22 = new Operate();
        operate22.setId(22L);
        operate22.setParentId(2L);
        operate22.setName("子目录22");

        operateList.add(operate21);
        operateList.add(operate22);

        return operateList;
    }

}

运行结果(JSON格式化后,树形):

[
    {
        "children": [
            {
                "children": [],
                "id": 11,
                "name": "子目录11",
                "parentId": 1
            },
            {
                "children": [],
                "id": 12,
                "name": "子目录12",
                "parentId": 1
            }
        ],
        "id": 1,
        "name": "根目录1",
        "parentId": 0
    },
    {
        "children": [
            {
                "children": [],
                "id": 21,
                "name": "子目录21",
                "parentId": 2
            },
            {
                "children": [],
                "id": 22,
                "name": "子目录22",
                "parentId": 2
            }
        ],
        "id": 2,
        "name": "根目录2",
        "parentId": 0
    }
]

最后

以上就是跳跃羊为你收集整理的java使用泛型实现树形java使用泛型实现树形一、树形的基本配置二、树形构造三、树形实体类四、测试的全部内容,希望文章能够帮你解决java使用泛型实现树形java使用泛型实现树形一、树形的基本配置二、树形构造三、树形实体类四、测试所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(72)

评论列表共有 0 条评论

立即
投稿
返回
顶部