最近,在研究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包。
最后运行效果如下:
192

被折叠的 条评论
为什么被折叠?



