Java的目录树的创建与展示

      最近,在研究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包。

最后运行效果如下:



   

阅读更多
个人分类: 程序
上一篇Air 调用本地化java程序
想对作者说点什么? 我来说一句

Java目录树控件

2014年05月13日 3KB 下载

java实现系统目录树控件

2008年11月19日 111KB 下载

java 生成文件结构目录树

2013年07月23日 2KB 下载

没有更多推荐了,返回首页

关闭
关闭