构造iview Tree结构

工程目录和类结构:

1.Book.java  测试model,包含id和父id还有name。

package com.dlmu.sei;

/**
 *
 * @author zhangtuo
 * @Date 2017/4/14
 */
public class Book {
    private String id;
    private String parentId;
    private String name;

    public String getId() {
        return id;
    }
    //省略get和set函数,构造函数等。
}

2.Constant.java  常量定义,父节点的uuid默认都是0字符串

package com.dlmu.sei;

/**
 * @author zhangtuo
 * @Date 2017/4/14
 */
public class Constant {
    public static final String UUID_PARENT = "00000000000000000000000000000000";
}

3.TreeNode.java  树结构model。

package com.dlmu.sei;

import java.util.List;

/**
 * iview的tree格式
 * @author zhangtuo
 * @Date 2017/4/14
 */
public class TreeNode {
    private String title;
    private boolean extend;//是否扩展
    private List<TreeNode> childrens;

    public String getTitle() {
        return title;
    }

    //省略get和set函数以及toString函数。
}

4.TreeUtil.java 生成树的类,以递归的方式构造。

package com.dlmu.sei;

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

/**
 * 生成树的结构
 * @author zhangtuo
 * @Date 2017/4/14
 */
public class TreeUtil {

    /**
     * 生出树结构。
     * @return
     */
    public TreeNode buildTree(List<Book> books) {
        //最后返回的treeNode
        TreeNode treeNode = new TreeNode();
        //遍历books
        for (Book book : books) {
            //拿到该book的父id
            String pid = book.getParentId();
            //如果pid是超级根节点,可以开始构造。
            if (pid.contains(Constant.UUID_PARENT)) {
                treeNode.setExtend(true);
                treeNode.setTitle(book.getName());
                build(book, books, treeNode);
            }
        }
        return treeNode;
    }

    private void build(Book book, List<Book> books, TreeNode treeNode) {
        List<Book> childrens = getChildrens(book, books);
        List<TreeNode> childrenNodes = new ArrayList<TreeNode>();
        //如果该book有叶子,则递归遍历叶子
        if (!childrens.isEmpty()) {
            for (Book child : childrens) {
                String childId = child.getId();
                TreeNode childNode = new TreeNode();
                childNode.setExtend(true);
                childNode.setTitle(child.getName());
                childrenNodes.add(childNode);
                build(child, books, childNode);
                if (childrenNodes.size() != 0) {
                    treeNode.setChildrens(childrenNodes);
                }
            }
        } else {
            //如果没有孩子,是不能扩展,extend为false
            treeNode.setExtend(false);
        }
    }

    /**
     * 查找某个节点下的叶子节点
     * @param book
     * @param books
     * @return
     */
    private List<Book> getChildrens(Book book, List<Book> books) {
        List<Book> childrens = new ArrayList<Book>();
        String id = book.getId();
        for (Book child : books) {
            //如果遍历中的parentId和book的id相同,则是它的子节点
            if (child.getParentId().equals(id)) {
                childrens.add(child);
            }
        }
        return childrens;
    }
}

5. TreeNodeTest.java 测试函数。

package com.dlmu.sei;

import com.alibaba.fastjson.JSONObject;
import net.sf.json.JSONArray;
import org.junit.Test;

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

/**
 * @author zhangtuo
 * @Date 2017/4/14
 */

public class TreeNodeTest {

    private static String uuid() {
        return UUID.randomUUID().toString().replace("-", "");
    }

    @Test
    public void test() {
        List<Book> books = generateTestData();
        TreeUtil treeUtil = new TreeUtil();
        TreeNode treeNode = treeUtil.buildTree(books);
        System.out.println(JSONArray.fromObject(treeNode));
    }

    private List<Book> generateTestData() {
        Book b0 = new Book(uuid(), Constant.UUID_PARENT, "book0");

        Book b1 = new Book(uuid(), b0.getId(), "book1");
        Book b2 = new Book(uuid(), b0.getId(), "book2");
        Book b3 = new Book(uuid(), b0.getId(), "book3");

        Book b11 = new Book(uuid(), b1.getId(), "book1-1");
        Book b12 = new Book(uuid(), b1.getId(), "book1-2");

        Book b111 = new Book(uuid(), b11.getId(), "book1-1-1");

        Book b21 = new Book(uuid(), b2.getId(), "book2-1");

        Book b31 = new Book(uuid(), b3.getId(), "book3-1");

        List<Book> books = new ArrayList<Book>();

        books.add(b0);
        books.add(b1);
        books.add(b2);
        books.add(b3);
        books.add(b11);
        books.add(b12);
        books.add(b111);
        books.add(b21);
        books.add(b31);
        return books;
    }
}

 

转载于:https://my.oschina.net/zhangtuoDMU/blog/879730

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值