forked from xkcoding/spring-boot-demo
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
184 additions
and
0 deletions.
There are no files selected for viewing
129 changes: 129 additions & 0 deletions
129
spring-boot-demo-util/src/main/java/com/xkcoding/util/TreeUtil.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,129 @@ | ||
package com.xkcoding.util; | ||
|
||
import com.google.common.collect.Lists; | ||
import com.xiaoleilu.hutool.json.JSONUtil; | ||
import com.xkcoding.util.domain.TreeNode; | ||
|
||
import java.util.Iterator; | ||
import java.util.List; | ||
|
||
/** | ||
* <p> | ||
* 把一个list集合,里面的bean含有 parentId 转为树形式 | ||
* </p> | ||
* | ||
* @package: com.xkcoding.util | ||
* @description: 把一个list集合, 里面的bean含有 parentId 转为树形式 | ||
* @author: yangkai.shen | ||
* @date: Created in 2017/12/7 上午10:26 | ||
* @copyright: Copyright (c) 2017 | ||
* @version: 0.0.1 | ||
* @modified: yangkai.shen | ||
*/ | ||
public class TreeUtil { | ||
|
||
/** | ||
* 测试层级 | ||
* | ||
* @param args | ||
*/ | ||
public static void main(String[] args) { | ||
long start = System.currentTimeMillis(); | ||
|
||
List<TreeNode> treeObjectList = Lists.newArrayList(); | ||
|
||
treeObjectList.add(new TreeNode(1, "总部", 0, "0", 1, "总部", Lists.<TreeNode>newArrayList())); | ||
treeObjectList.add(new TreeNode(2, "技术部", 1, "0,1", 1, "技术部", Lists.<TreeNode>newArrayList())); | ||
treeObjectList.add(new TreeNode(3, "软件部", 2, "0,1,2", 1, "软件部", Lists.<TreeNode>newArrayList())); | ||
treeObjectList.add(new TreeNode(4, "硬件部", 2, "0,1,2", 2, "硬件部", Lists.<TreeNode>newArrayList())); | ||
treeObjectList.add(new TreeNode(5, "维修部", 4, "0,1,2,4", 1, "维修部", Lists.<TreeNode>newArrayList())); | ||
treeObjectList.add(new TreeNode(6, "采购部", 4, "0,1,2,4", 2, "采购部", Lists.<TreeNode>newArrayList())); | ||
|
||
TreeUtil mt = new TreeUtil(); | ||
|
||
List<TreeNode> ns = mt.getChildTreeNodes(treeObjectList, 0); | ||
|
||
for (TreeNode m : ns) { | ||
System.out.println(m); | ||
System.out.println(JSONUtil.parseObj(m, false).toStringPretty()); | ||
} | ||
|
||
long end = System.currentTimeMillis(); | ||
|
||
System.out.println("用时:" + (end - start) + "ms"); | ||
} | ||
|
||
/** | ||
* 根据父节点 id 获取所有子节点 | ||
* | ||
* @param list 列表 | ||
* @param parentId 父节点 id | ||
* @return 所有子节点 | ||
*/ | ||
public List<TreeNode> getChildTreeNodes(List<TreeNode> list, Integer parentId) { | ||
List<TreeNode> returnList = Lists.newArrayList(); | ||
for (Iterator<TreeNode> iterator = list.iterator(); iterator.hasNext(); ) { | ||
TreeNode t = iterator.next(); | ||
// 一、根据传入的某个父节点ID,遍历该父节点的所有子节点 | ||
if (t.getParentId().equals(parentId)) { | ||
recursionFn(list, t); | ||
returnList.add(t); | ||
} | ||
} | ||
return returnList; | ||
} | ||
|
||
/** | ||
* 递归列表 | ||
* | ||
* @param list 列表 | ||
* @param t 树节点 | ||
*/ | ||
private void recursionFn(List<TreeNode> list, TreeNode t) { | ||
// 得到子节点列表 | ||
List<TreeNode> childList = getChildList(list, t); | ||
|
||
t.setChildren(childList); | ||
for (TreeNode tChild : childList) { | ||
// 判断是否有子节点 | ||
if (hasChild(list, tChild)) { | ||
Iterator<TreeNode> it = childList.iterator(); | ||
while (it.hasNext()) { | ||
TreeNode n = it.next(); | ||
recursionFn(list, n); | ||
} | ||
} | ||
} | ||
} | ||
|
||
/** | ||
* 判断是否存在子节点 | ||
* | ||
* @param list | ||
* @param tChild | ||
* @return | ||
*/ | ||
private boolean hasChild(List<TreeNode> list, TreeNode tChild) { | ||
return getChildList(list, tChild).size() > 0; | ||
} | ||
|
||
/** | ||
* 获得子节点列表 | ||
* | ||
* @param list | ||
* @param t | ||
* @return | ||
*/ | ||
private List<TreeNode> getChildList(List<TreeNode> list, TreeNode t) { | ||
List<TreeNode> tlist = Lists.newArrayList(); | ||
Iterator<TreeNode> it = list.iterator(); | ||
while (it.hasNext()) { | ||
TreeNode n = it.next(); | ||
if (n.getParentId().equals(t.getId())) { | ||
tlist.add(n); | ||
} | ||
} | ||
return tlist; | ||
} | ||
|
||
} |
55 changes: 55 additions & 0 deletions
55
spring-boot-demo-util/src/main/java/com/xkcoding/util/domain/TreeNode.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
package com.xkcoding.util.domain; | ||
|
||
import com.google.common.collect.Lists; | ||
import lombok.AllArgsConstructor; | ||
import lombok.Data; | ||
import lombok.NoArgsConstructor; | ||
|
||
import java.util.List; | ||
|
||
/** | ||
* <p> | ||
* 树节点 | ||
* </p> | ||
* | ||
* @package: com.xkcoding.util.domain | ||
* @description: 树节点 | ||
* @author: yangkai.shen | ||
* @date: Created in 2017/12/7 上午10:27 | ||
* @copyright: Copyright (c) 2017 | ||
* @version: 0.0.1 | ||
* @modified: yangkai.shen | ||
*/ | ||
@Data | ||
@AllArgsConstructor | ||
@NoArgsConstructor | ||
public class TreeNode { | ||
/** | ||
* id 编号 | ||
*/ | ||
private Integer id; | ||
/** | ||
* 节点名称 | ||
*/ | ||
private String name; | ||
/** | ||
* 父节点 id | ||
*/ | ||
private Integer parentId; | ||
/** | ||
* 层级 | ||
*/ | ||
private String level; | ||
/** | ||
* 当前层级顺序 | ||
*/ | ||
private Integer seq; | ||
/** | ||
* 备注 | ||
*/ | ||
private String remark; | ||
/** | ||
* 子节点列表 | ||
*/ | ||
private List<TreeNode> children = Lists.newArrayList(); | ||
} |