package com.tree;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import com.alibaba.fastjson.JSON;
public class Test {
public static void main(String[] args) throws Exception {
List<OrganizationVO> tnList = new ArrayList<OrganizationVO>();
OrganizationVO node0 = OrganizationVO.builder().id("0").code("0")
.name("机构0").parentId("").build();
OrganizationVO node00 = OrganizationVO.builder().id("00").code("00")
.name("机构00").parentId("").build();
OrganizationVO node11 = OrganizationVO.builder().id("11").code("11")
.name("部门11").parentId("00").build();
OrganizationVO node1 = OrganizationVO.builder().id("1").code("1")
.name("部门1").parentId("0").build();
OrganizationVO node22 = OrganizationVO.builder().id("22").code("22")
.name("CC2").parentId("11").build();
OrganizationVO node2 = OrganizationVO.builder().id("2").code("2")
.name("C").parentId("0").build();
OrganizationVO node3 = OrganizationVO.builder().id("3").code("3")
.name("D").parentId("0").build();
OrganizationVO node33 = OrganizationVO.builder().id("33").code("33")
.name("子节点").parentId("22").build();
OrganizationVO node4 = OrganizationVO.builder().id("4").code("4")
.name("B1").parentId("1").build();
OrganizationVO node5 = OrganizationVO.builder().id("5").code("5")
.name("B2").parentId("1").build();
OrganizationVO node6 = OrganizationVO.builder().id("6").code("6")
.name("C1").parentId("2").build();
OrganizationVO node7 = OrganizationVO.builder().id("7").code("7")
.name("D1").parentId("3").build();
OrganizationVO node8 = OrganizationVO.builder().id("8").code("8")
.name("D2").parentId("3").build();
tnList.add(node0);
tnList.add(node1);
tnList.add(node2);
tnList.add(node3);
tnList.add(node4);
tnList.add(node5);
tnList.add(node6);
tnList.add(node7);
tnList.add(node8);
tnList.add(node00);
tnList.add(node11);
tnList.add(node22);
tnList.add(node33);
Test test = new Test();
List<OrganizationVO> tList = test.useListRecordToTree(tnList);
String json = JSON.toJSONString(tList);
// List<OrganizationVO> tList1 =
// test.useListRecordToTreeByKeywords(tnList, "C", "name");
Map<String, Object> map = new HashMap();
map.put("name", "");
map.put("code", "7");
List<OrganizationVO> tList1 = test.useListRecordToTreeByKeywords(
tnList, map);
String json1 = JSON.toJSONString(tList1);
System.out.println(json1);
}
public List<OrganizationVO> useListRecordToTreeByKeywords(
List<OrganizationVO> allRecords, Map<String, Object> map)
throws Exception {
List<OrganizationVO> listRecord = new ArrayList<OrganizationVO>();
Map<String, OrganizationVO> allRecordMap = new HashMap<String, OrganizationVO>();
for (OrganizationVO record : allRecords) {
allRecordMap.put(record.getId(), record);
}
// 遍历allRrecords找出所有的nodeName和关键字keywords相关的数据
if (allRecords != null && allRecords.size() > 0) {
if (map != null && map.size() > 0) {
for (OrganizationVO record : allRecords) {
// 判断数据是否符合条件,只要有一个不符合返回false
Set<String> set = map.keySet();
boolean flag = true;
for (String key : set) {
Field f = record.getClass().getDeclaredField(key);
f.setAccessible(true);
if (f.get(record).toString().toLowerCase()
.indexOf(map.get(key).toString().toLowerCase()) != -1) {
flag = true;
} else {
flag = false;
break;
}
}
if (flag) {
listRecord.add(record);
}
}
} else {
listRecord.addAll(allRecords);
}
}
// 查找过滤出来的节点和他们的父节点
listRecord = this.getSelfAndTheirParentRecord(listRecord,
new ArrayList<OrganizationVO>(),
new HashMap<String, OrganizationVO>(), allRecordMap);
// 将过滤出来的数据变成树tree结构
listRecord = this.useListRecordToTree(listRecord);
return listRecord;
}
/**
* 说明方法描述:将list转为树tree结构
*
* @param allRrecords
* @return
* @time 2016年5月10日 下午6:00:35
* @author yangdong
*/
public List<OrganizationVO> useListRecordToTree(
List<OrganizationVO> allRrecords) {
List<OrganizationVO> listParentRecord = new ArrayList<OrganizationVO>();
List<OrganizationVO> listNotParentRecord = new ArrayList<OrganizationVO>();
// 第一步:遍历allRrecords保存所有数据的uuid用于判断是不是根节点
Map<String, String> mapAllUuid = new HashMap<String, String>();
Map<String, OrganizationVO> allRecordMap = new HashMap<String, OrganizationVO>();
for (OrganizationVO record : allRrecords) {
mapAllUuid.put(record.getId(), record.getId());
allRecordMap.put(record.getId(), record);
}
// 第二步:遍历allRrecords找出所有的根节点和非根节点
if (allRrecords != null && allRrecords.size() > 0) {
for (OrganizationVO record : allRrecords) {
if (StringUtils.isBlank(record.getParentId())
|| !mapAllUuid.containsKey(record.getParentId())) {
listParentRecord.add(record);
} else {
listNotParentRecord.add(record);
}
}
}
// 第三步: 递归获取所有子节点
if (listParentRecord.size() > 0) {
for (OrganizationVO record : listParentRecord) {
// 添加所有子级
record.setChildren(this.getTreeChildRecord(listNotParentRecord,
record.getId()));
}
}
return listParentRecord;
}
/**
* 说明方法描述:使list转换为树并根据关键字和节点名称过滤
*
* @param allRecords
* 所有节点
* @param keywords
* 要过滤的关键字
* @param filterFields
* 要过滤的字段
* @return
* @time 2016年5月19日 下午3:27:32
* @author yangdong
* @throws Exception
*/
public List<OrganizationVO> useListRecordToTreeByKeywords(
List<OrganizationVO> allRecords, String keywords,
String... filterFields) throws Exception {
List<OrganizationVO> listRecord = new ArrayList<OrganizationVO>();
Map<String, OrganizationVO> allRecordMap = new HashMap<String, OrganizationVO>();
for (OrganizationVO record : allRecords) {
allRecordMap.put(record.getId(), record);
}
// 遍历allRrecords找出所有的nodeName和关键字keywords相关的数据
if (allRecords != null && allRecords.size() > 0) {
if (filterFields.length > 0) {
for (OrganizationVO record : allRecords) {
for (String field : filterFields) {
// 比较
Field f = record.getClass().getDeclaredField(field);
f.setAccessible(true);
if (f.get(record).toString().toLowerCase()
.indexOf(keywords.toLowerCase()) != -1) {
listRecord.add(record);
}
}
}
} else {
/*
* for (OrganizationVO record : allRecords) { // 比较 if
* (record.getStr
* (filterFields[0]).toLowerCase().indexOf(keywords
* .toLowerCase()) != -1) { listRecord.add(record); } }
*/
}
}
// 查找过滤出来的节点和他们的父节点
listRecord = this.getSelfAndTheirParentRecord(listRecord,
new ArrayList<OrganizationVO>(),
new HashMap<String, OrganizationVO>(), allRecordMap);
// 将过滤出来的数据变成树tree结构
listRecord = this.useListRecordToTree(listRecord);
return listRecord;
}
/**
* 说明方法描述:递归查询子节点
*
* @param childList
* 子节点
* @param parentUuid
* 父节点id
* @return
* @time 2016年5月10日 下午3:29:35
* @author yangdong
*/
private List<OrganizationVO> getTreeChildRecord(
List<OrganizationVO> childList, String parentUuid) {
List<O