Java的目录树的创建与展示

原创 2014年09月15日 21:53:27

      最近,在研究java的目录树的生成,想把从数据库中的数据提取出来,来构成相应的目录树,想了半天,得到了一个可行的方案。不多说,代码如下。

   使用的mysql的数据库,sql语句如下:

  

-- 创建数据库

create database bbs;

use bbs;

-- 创建表
-- 使用

create table article (
id int primary key auto_increment,
pid int,
rootid int,
title varchar(255),
cont text,
pdate datetime,
isleaf int
);

-- 0代表是leaf,1代表不是leaf

insert into article values (null,0,1,'蚂蚁大战大象','蚂蚁大战大象',now(),1);
insert into article values (null,1,1,'大象被打趴下了','大象被打趴下了',now(),1);
insert into article values (null,2,1,'蚂蚁也不好过','蚂蚁也不好过',now(),0);
insert into article values (null,2,1,'瞎说','瞎说',now(),1);
insert into article values (null,4,1,'没有瞎说','没有瞎说',now(),0);
insert into article values (null,1,1,'怎么可能','怎么可能',now(),1);
insert into article values (null,6,1,'怎么没有可能','怎么没有可能',now(),1);
insert into article values (null,6,1,'可能性是很大的','可能性是很大的',now(),0);
insert into article values (null,2,1,'大象进医院了','大象进医院了',now(),1);
insert into article values (null,9,1,'护士是蚂蚁','护士是蚂蚁',now(),0);

-- 蚂蚁大战大象
--  大象被打趴下了
--     蚂蚁也不好过
--     瞎说
--        没有瞎说
--     大象进医院了
--        护士是蚂蚁
-- 怎么可能
--     怎么没有可能
--     可能性是很大的
     
             
        
这些都是测试数据,使用到的只有id,pid,title字段这三个.

接下来是比较关键的Node类,关键的一点是里面含有一个children的数组,代码如下:

package com.bin.test;

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

public class Node {

	private int id; // 节点编号
	private int pid; // 父亲节点
	private String title;
	private Boolean is_Show;
	private List<Node> childrens = new ArrayList<Node>();

	public int getId() {
		return id;
	}

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

	public int getPid() {
		return pid;
	}

	public void setPid(int pid) {
		this.pid = pid;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public Boolean getIs_Show() {
		return is_Show;
	}

	public void setIs_Show(Boolean is_Show) {
		this.is_Show = is_Show;
	}

	public List<Node> getChildrens() {
		return childrens;
	}

	public void setChildrens(List<Node> childrens) {
		this.childrens = childrens;
	}

}

再接下来是最关键的目录树的构造了,设计思想是,使用一个中介的Map,程序里面名字是tree,使用它来辅助各个父亲节点添加自己的子类。打印目录树,采用的是先打印最顶级节点,再递归打印全部孩子节点的思想。

其代码如下:

package com.bin.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class MyDataTree {

	private List<Node> dataArray = new ArrayList<Node>();
	private Map<Integer, Node> tree = new HashMap<Integer, Node>();

	public void initArray() {
		try {
			Class.forName("com.mysql.jdbc.Driver");
			String url = "jdbc:mysql://localhost/bbs?user=root&password=root";
			Connection conn = DriverManager.getConnection(url);
			Statement stmt = conn.createStatement();
			ResultSet rs = stmt
					.executeQuery("select * from article order by id");
			while (rs.next()) {
				Node node = new Node();
				node.setId(rs.getInt("id"));
				node.setPid(rs.getInt("pid"));
				node.setTitle(rs.getString("title"));
				dataArray.add(node);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	public void printArray() {
		if (dataArray.size() > 0) {
			for (Iterator<Node> it = dataArray.iterator(); it.hasNext();) {
				Node n = (Node) it.next();
				System.out.println("编号" + n.getId() + "   父节点" + n.getPid()
						+ "   内容" + n.getTitle());
			}
		}
	}

	public void buildTree() {
		for (Iterator<Node> it = dataArray.iterator(); it.hasNext();) {
			Node n = (Node) it.next();
			if (n.getPid() == 0) { // 获取顶级节点
				tree.put(n.getId(), n);
			} else {
				Node parentNode = tree.get(n.getPid());
				parentNode.getChildrens().add(n);
				tree.put(n.getId(), n);
			}
		}

	}

	public void printDataByTree() {
		Iterator<Entry<Integer, Node>> it = tree.entrySet().iterator();
		while (it.hasNext()) {
			// 先获取父亲节点
			@SuppressWarnings("rawtypes")
			Map.Entry entry = (Map.Entry) it.next();
			Node node = (Node) entry.getValue();
			if (node.getPid() == 0) {
				System.out.println("----节点编号:" + node.getId() + "父节点:"
						+ node.getPid() + "内容:" + node.getTitle());
				// 再遍历其孩子
				getAllChildren(node, 1);
			}
		}
	}

	public void getAllChildren(Node node, int level) {
		String str = "----";
		for (int i = 0; i < level; i++) {
			str += "----";
		}

		if (node.getChildrens().size() > 0) {
			for (Iterator<Node> it = node.getChildrens().iterator(); it
					.hasNext();) {
				Node child = (Node) it.next();
				System.out.println(str + "节点编号:" + child.getId() + "父节点:"
						+ child.getPid() + "内容:" + child.getTitle());
				getAllChildren(child, level + 1);
			}
		}
	}

	public static void main(String[] args) {
		MyDataTree testTree = new MyDataTree();
		testTree.initArray();
		// testTree.printArray();
		testTree.buildTree();
		testTree.printDataByTree();
	}
}
需要说得是,别忘了添加链接mysql的jdbc包。

最后运行效果如下:



   

java从数据库读取菜单,递归生成菜单树

java从数据库读取菜单,递归生成菜单树
  • frankcheng5143
  • frankcheng5143
  • 2016年10月29日 13:44
  • 16970

java 递归生成目录

import java.io.File;    public class DirRecursion { // mkdirs()       public static void mkDir(File...
  • hephec
  • hephec
  • 2014年07月19日 14:19
  • 2877

Java递归算法实现目录树的遍历

具体请看代码实现,挺简单的。 package com.bz.a; import java.io.File; /** * 递归算法实现目录树的遍历 */ public class Recursi...
  • qq_34489300
  • qq_34489300
  • 2017年01月03日 16:17
  • 590

java 输出给定路径下的所有文件(目录树)

给路径如E盘下的test文件夹,遍历出test下的所有文件并输出。 test文件夹下有这些文件 E:\\test java代码如下:      package test; i...
  • jenyzhang
  • jenyzhang
  • 2015年04月06日 14:59
  • 2097

深入JAVA之 java 生成目录树工具类 v1

目录树生成工具  {@linkplain #setDeep(int) 设置查询目录深度}  {@linkplain #setFileFilter(FileFilter)}  设置查询文件筛选过滤器} ...
  • u011278496
  • u011278496
  • 2016年10月21日 10:12
  • 1438

用纯java自定义自己的树形菜单

用纯java自定义自己的树形菜单转自small_ding的专栏 1.定义每个树节点信息的类package BSC.tree;import java.io.*;import java.util.*;/*...
  • rcyl2003
  • rcyl2003
  • 2007年05月06日 22:23
  • 4892

将树形菜单拼接为名称+路径

这几天用户提出来一个这样的需求,要看上次系统上线的时候和这次要上线的系统的的菜单做一下对比,找出来那些的是新增的。而且要把路径写出来!         我一想这个比较简单,直接查查菜单, 给他统计一...
  • zhanghongjie0302
  • zhanghongjie0302
  • 2015年12月16日 17:53
  • 2068

java中关于目录树的简单实现

// 编写程序,显示指定目录下的所有文件目录及所有子目录。 // 用递归实现 // 程序运行可以输入自定义的目录、默认目录为:当前文件所在的目录 // 自定义的输入结构为:java FileDemo2...
  • oucxc
  • oucxc
  • 2016年05月08日 22:02
  • 386

Java目录树控件

  • 2014年05月13日 23:42
  • 3KB
  • 下载

java实现系统目录树控件

  • 2008年11月19日 13:52
  • 111KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java的目录树的创建与展示
举报原因:
原因补充:

(最多只允许输入30个字)