遍历树节点

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 {


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

* 要求打印如下效果:

*
 
  
* 市场部
* 宣传部
* 业务部
* 业务一部
* 业务二部
* 开发部
* 开发一部
* 开发二部
*

*/
@Test
public void printAllDepts_1() {
// 顶级树的根节点集合
List 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 topList) {
for (Department department : topList) {
// 顶点信息
System.out.println(department.getName());
// 子树 注: 此处返回的是一个set集合,所有要将参数定义为Collection类型
showTreeListInfo(department.getChildren());
}
}






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

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

* 要求打印如下效果:

*
 
  
* ┣市场部
*    ┣宣传部
*    ┣业务部
*       ┣业务一部
*       ┣业务二部
* ┣开发部
*    ┣开发一部
*    ┣开发二部
*

*/
@Test
public void printAllDepts_2() {
List topList = findTopLevelDepartmentList();
showTreeListInfo(topList, "");
}


private void showTreeListInfo(Collection 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 getAllDepartmentList(List topList,Department removedDepartment) {
List list = new ArrayList();
walkTree(topList,"┣",list,removedDepartment);
return list;
}



// 递归遍历
private static void walkTree(Collection topList,String prefix,List 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忽略多余的空格 
}
}





/**
* 结构如下:

*
 
  
* ┣市场部
*    ┣宣传部
*    ┣业务部
*       ┣业务一部
*       ┣业务二部
* ┣开发部
*    ┣开发一部
*    ┣开发二部
*


* @return 所有最顶层的部门的列表
*/
public static List 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 children_0 = new LinkedHashSet();
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 children_1 = new LinkedHashSet();
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 children_2 = new LinkedHashSet();
children_2.add(dept_2_1);
children_2.add(dept_2_2);
dept_2.setChildren(children_2);


// ---


List depts = new ArrayList();
depts.add(dept_1);
depts.add(dept_2);
return depts;
}


}






你可能感兴趣的:(工具类Utils)