您的位置:首页 > 其它

遍历树节点

2016-04-02 11:08 197 查看
package cn.itcast.oa.test;

import java.util.ArrayList;

import java.util.Collection;

import java.util.LinkedHashSet;

import java.util.List;

import java.util.Set;

import org.junit.Test;

import cn.itcast.oa.domain.Department;

/**

* 说明:不能使用多层循环的方式,因为需要能支持任意层。

*/

public class TreeViewPractice {

/**

* 练习一:打印所有顶层部门及其子孙部门的信息(名称) 提示:假设有一个 打印部门树 的信息 的方法

*

* 要求打印如下效果:

*

* <pre>

* 市场部

* 宣传部

* 业务部

* 业务一部

* 业务二部

* 开发部

* 开发一部

* 开发二部

* </pre>

*/

@Test

public void printAllDepts_1() {

// 顶级树的根节点集合

List<Department> topList = findTopLevelDepartmentList();

// // 方式一

// for (Department department : topList) {

// showTreeInfo(department);

// }

// 方式二

showTreeListInfo(topList);

}

// 方式一: 显示一棵树的信息

private void showTreeInfo(Department top) {

// 顶点信息

System.out.println(top.getName());

// 子树

for (Department department : top.getChildren()) {

showTreeInfo(department);

}

}

// 方式二: 显示多棵树的信息

private void showTreeListInfo(Collection<Department> topList) {

for (Department department : topList) {

// 顶点信息

System.out.println(department.getName());

// 子树 注: 此处返回的是一个set集合,所有要将参数定义为Collection类型

showTreeListInfo(department.getChildren());

}

}

/**

* 练习二:打印所有顶层部门及其子孙部门的信息(名称),用不同的缩进表示层次(使用全角空格)。<br>

* 子部门的名称前比上级部门多一个空格,最顶层部门的名字前没有空格。 提示:假设有一个打印部门集合中所有部门信息的方法

*

* 要求打印如下效果:

*

* <pre>

* ┣市场部

* ┣宣传部

* ┣业务部

* ┣业务一部

* ┣业务二部

* ┣开发部

* ┣开发一部

* ┣开发二部

* </pre>

*/

@Test

public void printAllDepts_2() {

List<Department> topList = findTopLevelDepartmentList();

showTreeListInfo(topList, "");

}

private void showTreeListInfo(Collection<Department> topList,String prefix) {

for (Department department : topList) {

// 根节点信息

System.out.println(prefix + "┣"+department.getName());

// 子树

showTreeListInfo(department.getChildren()," "+prefix);

}

}

// 实例应用

/**

* 遍历部门树,把所有的部门都改变名称后放到同一个list中返回,通过名称中的空格表示层次

* @param topList

* @param removedDepartment 要移除的分支部门: 该部门和该部门的子部门都不要

* @return

*/

public static List<Department> getAllDepartmentList(List<Department> topList,Department removedDepartment) {

List<Department> list = new ArrayList<Department>();

walkTree(topList,"┣",list,removedDepartment);

return list;

}

// 递归遍历

private static void walkTree(Collection<Department> topList,String prefix,List<Department> list,Department removedDepartment){

for (Department top : topList) {

// 去掉指定的部门分支

if(removedDepartment!=null && top.getId().equals(removedDepartment.getId())){

continue;

}

// 根节点 注: 不要修改Session缓存中的对象,最好使用副本(重新new一个对象即可)

Department copy = new Department();

copy.setId(top.getId());

copy.setName(prefix + top.getName());

list.add(copy);
// 注: 添加的是copy对象,只需id和name属性即可

// 子树

walkTree(top.getChildren(), "  " + prefix,list,removedDepartment); // 此处使用的是全角的空格,避免HTML忽略多余的空格

}

}

/**

* 结构如下:

*

* <pre>

* ┣市场部

* ┣宣传部

* ┣业务部

* ┣业务一部

* ┣业务二部

* ┣开发部

* ┣开发一部

* ┣开发二部

* </pre>

*

* @return 所有最顶层的部门的列表

*/

public static List<Department> findTopLevelDepartmentList() {

Department dept_1_1 = new Department();

dept_1_1.setId(new Long(11));

dept_1_1.setName("宣传部");

Department dept_1_2 = new Department();

dept_1_2.setId(new Long(12));

dept_1_2.setName("业务部");

Department dept_1_2_1 = new Department();

dept_1_2_1.setId(new Long(121));

dept_1_2_1.setName("业务一部");

Department dept_1_2_2 = new Department();

dept_1_2_2.setId(new Long(122));

dept_1_2_2.setName("业务二部");

dept_1_2_1.setParent(dept_1_2);

dept_1_2_2.setParent(dept_1_2);

Set<Department> children_0 = new LinkedHashSet<Department>();

children_0.add(dept_1_2_1);

children_0.add(dept_1_2_2);

dept_1_2.setChildren(children_0);

// ================================

Department dept_1 = new Department();

dept_1.setId(new Long(1));

dept_1.setName("市场部");

dept_1_1.setParent(dept_1);

dept_1_2.setParent(dept_1);

Set<Department> children_1 = new LinkedHashSet<Department>();

children_1.add(dept_1_1);

children_1.add(dept_1_2);

dept_1.setChildren(children_1);

// ---

Department dept_2_1 = new Department();

dept_2_1.setId(new Long(21));

dept_2_1.setName("开发一部");

Department dept_2_2 = new Department();

dept_2_2.setId((new Long(22)));

dept_2_2.setName("开发二部");

Department dept_2 = new Department();

dept_2.setId(new Long(2));

dept_2.setName("开发部");

dept_2_1.setParent(dept_2);

dept_2_2.setParent(dept_2);

Set<Department> children_2 = new LinkedHashSet<Department>();

children_2.add(dept_2_1);

children_2.add(dept_2_2);

dept_2.setChildren(children_2);

// ---

List<Department> depts = new ArrayList<Department>();

depts.add(dept_1);

depts.add(dept_2);

return depts;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: