传智播客-----递归实现与实现转换数据的方法

递归打印部门结构
本文通过递归方式展示了如何打印组织结构中的部门信息,并对比了不同的打印效果。使用递归方法能够清晰地展示多级部门之间的层级关系。
今天汤阳光老师给我们讲递归实现与实现转换数据方法的不同效果!

用递归实现不同效果:
/**
* 要求打印如下效果:
*
* <pre>
* 传智播客
* 市场部
* 市场1部
* 市场2部
* 开发部
* 开发1部
* 开发2部
* </pre>
*/
package cn.itcast.oa.test;

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

import org.junit.Test;

import cn.itcast.oa.entities.Department;

public class WebTreeViewUtilsTest {
效果1:
/**
* 要求打印如下效果:
*
* <pre>
* 传智播客
* 市场部
* 市场1部
* 市场2部
* 开发部
* 开发1部
* 开发2部
* </pre>
*/
效果2:
/**
* 要求打印如下效果:
*
* <pre>
* ┠传智播客
*  ┠市场部
*   ┠市场1部
*   ┠市场2部
*  ┠开发部
*   ┠开发1部
*   ┠开发2部
*
* </pre>
*/
@Test
public void printAllDepts_1() {
List<Department> depts = findTopLevelDepartments();
for (Department dept : depts) {
printDeptInfo_1(dept);
}
}

// 打印出部门的信息
public void printDeptInfo_1(Department dept) {
// 1,名称
System.out.println(dept.getName());
// 2,子部门
for (Department d : dept.getChildren()) {
printDeptInfo_1(d);
}
}

/**
* 要求打印如下效果:
*
* <pre>
* ┠传智播客
*  ┠市场部
*   ┠市场1部
*   ┠市场2部
*  ┠开发部
*   ┠开发1部
*   ┠开发2部
*
* </pre>
*/
@Test
public void printAllDepts_2() {
List<Department> depts = findTopLevelDepartments();
for (Department dept : depts) {
printDeptInfo_2(dept, "");
}
}

public void printDeptInfo_2(Department dept, String prefix) {
// 1,名称
System.out.println(prefix + "┠" + dept.getName());
// 2,子部门
for (Department d : dept.getChildren()) {
printDeptInfo_2(d, prefix + " ");
}
}

/**
* 要求打印如下效果:
*
* <pre>
* ┠传智播客
*  ┠市场部
*   ┠市场1部
*   ┠市场2部
*  ┠开发部
*   ┠开发1部
*   ┠开发2部
*
* </pre>
*/
@Test
public void printAllDepts_3() {
List<Department> topLevelDepts = findTopLevelDepartments();
List<Department> allDepts = getAllDepts_3(topLevelDepts, "");
for (Department dept : allDepts) {
System.out.println(dept.getName());
}
}

// 返回当前所有部门及其子孙部门的集合
public List<Department> getAllDepts_3(Collection<Department> depts, String prefix) {
List<Department> list = new ArrayList<Department>();
for (Department dept : depts) {
dept.setName(prefix + "┠" + dept.getName());
list.add(dept);

List<Department> subDepts = getAllDepts_3(dept.getChildren(), prefix + " ");
list.addAll(subDepts);
}
return list;
}

// ---
@Test
public void printAllDepts_3_2() {
List<Department> topLevelDepts = findTopLevelDepartments();
List<Department> allDepts = new ArrayList<Department>();

preAllDepts_3_2(topLevelDepts, "", allDepts);
for (Department dept : allDepts) {
System.out.println(dept.getName());
}
}

public void preAllDepts_3_2(Collection<Department> depts, String prefix, List<Department> allDepts) {
for (Department dept : depts) {
dept.setName(prefix + "┠" + dept.getName());
allDepts.add(dept);

preAllDepts_3_2(dept.getChildren(), prefix + " ", allDepts);
}
}

// ---

/**
* @return 所有最顶层的部门的列表
*/
public static List<Department> findTopLevelDepartments() {
Department dept11 = new Department();
dept11.setId(11);
dept11.setName("市场1部");
Department dept12 = new Department();
dept12.setId(12);
dept12.setName("市场2部");

Department dept1 = new Department();
dept1.setId(1);
dept1.setName("市场部");
dept1.getChildren().add(dept11);
dept1.getChildren().add(dept12);

Department dept21 = new Department();
dept21.setId(21);
dept21.setName("开发1部");
Department dept22 = new Department();
dept22.setId(22);
dept22.setName("开发2部");

Department dept2 = new Department();
dept2.setId(2);
dept2.setName("开发部");
dept2.getChildren().add(dept21);
dept2.getChildren().add(dept22);

Department itcast = new Department();
itcast.setId(1000);
itcast.setName("传智播客");
itcast.getChildren().add(dept1);
itcast.getChildren().add(dept2);

List<Department> depts = new ArrayList<Department>();
depts.add(itcast);
return depts;
}
}

实现一个窗口选择后数据跑到另一个页面并自动关闭的例题:
main.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<!--
<script type="text/javascript" src="script.js"></script>
<link rel="stylesheet" type="text/css" href="style.css">
-->
<script type="text/javascript">
function openSelDept(){
var url="selDept.html";
window.showModalDialog(url,window,"dialogwidth:350px;dialogHeight:350px");


// var win= window.open(url,"selDept","menubar=no,toolbar=no");
//win.focus();
}
</script>
</head>
<body>

<form>
所属部门<input type="text" name="deptName" readonly="true"/>

<input type="button" value="选择部门" onclick="openSelDept()"/>
</form>
<script type="text/javascript">
</script>
</body>
</html>


<html>
<head>
<base target="_self"/>
<meta http-equiv="Content-Type" content="text/html; charset=GBK"/>
<!--
<script type="text/javascript" src="script.js"></script>
<link rel="stylesheet" type="text/css" href="style.css">
-->
<script type="text/javascript">
function selMe(deptName){
var mainWindow =window.dialogArguments;

mainWindow.document.forms[0].deptName.value=deptName;

// window.close();
}
</script>
</head>
<body>
<a href="javascript:selMe('市场部')"> 市场部</a>

<a href="javascript:selMe('开发部门')"> 开发部门</a>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值