增强版JAVA实现文本形式的树状结构显示




应网友要求,重新书写了代码,请参考使用。旧代码毅然保留,在文章的后半部

此最新代码增加了对下拉列表的输出支持,可以直接使用在<select>里面
同时可以访问父节点和兄弟节点。

package net.java2000.tools;

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

/** *//**
* 树状结构的文本显示和下拉框显示。<br>
* 转载请保留本说明,并注明出处<br>
* www.java2000.net<br>
* blog.csdn.net/java2000_net/
*
* @version 2008.02.23
* @author 赵学庆
*/
public class ForumFolder ...{
// 编号
private long id;

// 标题
private String title;

// 下级列表
private List<ForumFolder> children = new ArrayList<ForumFolder>();

// 上级,顶层为null
private ForumFolder parent;

// 前一个节点
private ForumFolder prev;

// 后一个节点
private ForumFolder next;

// 当前处理的节点
private ForumFolder current;

/** *//**
* 默认的构造器
*/
public ForumFolder() ...{
}

/** *//**
* 推荐使用的构造器
*
* @param id 编号
* @param title 文本
*/
public ForumFolder(long id, String title) ...{
this.id = id;
this.title = title;
}

/** *//**
* 增加一个下属。<br>
* 自动对应上级和兄弟结点
*
* @param f 被增加的节点
*/
public void addChild(ForumFolder f) ...{
children.add(f);
f.setParent(this);
if (current != null) ...{
current.next = f;
}
f.prev = current;
current = f;
}

/** *//**
* 输出为下拉列表的方法
*
* @param selectedId 被选中的编号
* @return 下拉列表的字符串。可以直接放到<select></select>里面
*/
public String getOption(long selectedId) ...{
return "<option>" + toStringOption("", "", selectedId);
}

/** *//**
* 输出为Text的方法。<br>
* 应网友建议,更改toString为toStringText方法。
*
* @param lftStr 左侧额外的字符串
* @param append 右侧显示的字符串
* @return 文本形式的字符串
*/
public String toStringText(String lftStr, String append) ...{
StringBuilder b = new StringBuilder();
b.append(append + title);
b.append(" ");
if (children.size() > 0) ...{
for (int i = 0; i < children.size() - 1; i++) ...{
b.append(lftStr + children.get(i).toStringText(lftStr + "│", "├"));
}
b.append(lftStr + children.get(children.size() - 1).toStringText(lftStr + " ", "└"));
}
return b.toString();
}

public static void main(String[] args) ...{
ForumFolder root = new ForumFolder(0, "菜单列表");
ForumFolder f1 = new ForumFolder(1, "开始菜单");
root.addChild(f1);
ForumFolder f1_1 = new ForumFolder(11, "程序");
f1.addChild(f1_1);
ForumFolder f1_1_1 = new ForumFolder(111, "附件");
f1_1.addChild(f1_1_1);
ForumFolder f1_1_1_1 = new ForumFolder(1111, "娱乐");
f1_1_1.addChild(f1_1_1_1);
ForumFolder f1_1_1_2 = new ForumFolder(1112, "娱乐2");
f1_1_1.addChild(f1_1_1_2);
ForumFolder f1_2 = new ForumFolder(12, "辅助工具");
f1.addChild(f1_2);
ForumFolder f2 = new ForumFolder(2, "My Documents ");
root.addChild(f2);
ForumFolder f3 = new ForumFolder(3, "My Documents2 ");
root.addChild(f3);
System.out.println(root.toStringText(" ", ""));
System.out.println(root.getOption(111));
System.out.println(f1_1_1_2.getPrev().getTitle());
System.out.println(f1_1_1_2.getPrev().getParent().getTitle());
}

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

public long getId() ...{
return id;
}

/** *//**
* 得到下一个兄弟结点。
*
* @return 如果是最后一个,则返回null
*/
public ForumFolder getNext() ...{
return next;
}

public ForumFolder getParent() ...{
return parent;
}

/** *//**
* 得到前一个兄弟结点。
*
* @return 如果是第一个,则返回null
*/
public ForumFolder getPrev() ...{
return prev;
}

public String getTitle() ...{
return title;
}

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

public void setNext(ForumFolder next) ...{
this.next = next;
}

public void setParent(ForumFolder parent) ...{
this.parent = parent;
}

public void setPrev(ForumFolder prev) ...{
this.prev = prev;
}

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

/** *//**
* 构造下拉列表.
*
* @param lftStr 左侧的字符
* @param append 增加的字符
* @param idSelected 被选中的编号
* @return 下拉列表字符串
*/
private String toStringOption(String lftStr, String append, long idSelected) ...{
StringBuilder b = new StringBuilder();
b.append(append + title + "</option>");
b.append(" ");
if (children.size() > 0) ...{
for (int i = 0; i < children.size() - 1; i++) ...{
b.append("<option value='" + children.get(i).getId() + "'" + (idSelected == children.get(i).getId() ? " selected" : "")
+ ">" + lftStr + children.get(i).toStringOption(lftStr + "│", "├", idSelected));
}
b.append("<option value='" + children.get(children.size() - 1).getId() + "'"
+ (idSelected == children.get(children.size() - 1).getId() ? " selected" : "") + ">" + lftStr
+ children.get(children.size() - 1).toStringOption(lftStr + " ", "└", idSelected));
}
return b.toString();
}
}

运行结果如下:


菜单列表
├开始菜单
│├程序
││└附件
││ ├娱乐
││ └娱乐2
│└辅助工具
├My Documents
└My Documents2

<option>菜单列表</option>
<option value='1'>├开始菜单</option>
<option value='11'>│├程序</option>
<option value='111' selected>││└附件</option>
<option value='1111'>││ ├娱乐</option>
<option value='1112'>││ └娱乐2</option>
<option value='12'>│└辅助工具</option>
<option value='2'>├My Documents </option>
<option value='3'>└My Documents2 </option>

娱乐
附件

原文出处: http://www.java2000.net/viewthread.jsp?tid=944

--------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------- 以下为老版本的代码,仅供参考 -------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------


代码如下,可根据需求衍生出各种格式的输出和使用

package test;

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

public class Folder ...{
public Folder(String title) ...{
this.title = title;
}

private String title;

private List<Folder> children = new ArrayList<Folder>();

public void addChild(Folder f) ...{
children.add(f);
}

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

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

public String getTitle() ...{
return title;
}

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

public String toString(String lftStr, String append) ...{
StringBuilder b = new StringBuilder();
b.append(append + title);
b.append("\n");
if (children.size() > 0) ...{
for (int i = 0; i < children.size() - 1; i++) ...{
b.append(lftStr+children.get(i).toString(lftStr + "│", "├"));
}
b.append(lftStr + children.get(children.size() - 1).toString(
lftStr + " ", "└"));

}
return b.toString();

}

public static void main(String[] args) ...{
Folder root = new Folder("菜单列表");
Folder f1 = new Folder("开始菜单");
root.addChild(f1);
Folder f1_1 = new Folder("程序");
f1.addChild(f1_1);
Folder f1_1_1 = new Folder("附件");
f1_1.addChild(f1_1_1);
Folder f1_1_1_1 = new Folder("娱乐");
f1_1_1.addChild(f1_1_1_1);
Folder f1_1_1_2 = new Folder("娱乐2");
f1_1_1.addChild(f1_1_1_2);
Folder f1_2 = new Folder("辅助工具");
f1.addChild(f1_2);
Folder f2 = new Folder("My Documents ");
root.addChild(f2);
Folder f3 = new Folder("My Documents2 ");
root.addChild(f3);

System.out.println(root.toString(" ", ""));
}
}

运行结果如下:

菜单列表
├开始菜单
│├程序
││└附件
││ ├娱乐
││ └娱乐2
│└辅助工具
├My Documents
└My Documents2
应网友要求,增加了JDK 1.4版及以下的程序版本,取消了泛型

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

public class Folder ...{
public Folder(String title) ...{
this.title = title;
}

private String title;

private List children = new ArrayList();

public void addChild(Folder f) ...{
children.add(f);
}

public List getChildren() ...{
return children;
}

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

public String getTitle() ...{
return title;
}

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

public String toString(String lftStr, String append) ...{
StringBuilder b = new StringBuilder();
b.append(append + title);
b.append(" ");
if (children.size() > 0) ...{
for (int i = 0; i < children.size() - 1; i++) ...{
b.append(lftStr + ((Folder) children.get(i)).toString(lftStr + "│", "├"));
}
b.append(lftStr + ((Folder) children.get(children.size() - 1)).toString(lftStr + " ", "└"));
}
return b.toString();
}

public static void main(String[] args) ...{
Folder root = new Folder("菜单列表");
Folder f1 = new Folder("开始菜单");
root.addChild(f1);
Folder f1_1 = new Folder("程序");
f1.addChild(f1_1);
Folder f1_1_1 = new Folder("附件");
f1_1.addChild(f1_1_1);
Folder f1_1_1_1 = new Folder("娱乐");
f1_1_1.addChild(f1_1_1_1);
Folder f1_1_1_2 = new Folder("娱乐2");
f1_1_1.addChild(f1_1_1_2);
Folder f1_2 = new Folder("辅助工具");
f1.addChild(f1_2);
Folder f2 = new Folder("My Documents ");
root.addChild(f2);
Folder f3 = new Folder("My Documents2 ");
root.addChild(f3);
System.out.println(root.toString(" ", ""));
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值