一个树结构的对象,层次不限.可用户自定义增加 如
public class Org{
private String id;
private String name;
private List<Org> children;
}
在查询的时候直接封装成一个树结构.
List<Org> list = this.sqlFind(sb.toString(), Org.class, params.toArray());//查询出所有部门id
List<Org> result = new ArrayList<>();
Map<String, Org> map = new LinkedHashMap(); //id,org
for(Org o : list){
o = get(o.getId());//获取org对象
o.setChildren(new ArrayList<Org>());
map.put(o.getId(), o);
Org parent = null;
}
for(String orgId : map.keySet()){
//设置父子关系 children
Org org = map.get(orgId);
Org parent = org.getParent();
if(parent != null)
parent.getChildren().add(org);
result.add(org);
}
使用以下则可取出所有org对象放到集合中
List<OutputSummaryVo> retVoList = new ArrayList<>(); //结果
while(!orgs.isEmpty()){
Org org = orgs.remove(0);
OrgVo vo = new OrgVo();
vo.setId(org.getId());
vo.setName(org.getName());
retVoList.add(vo);
orgs.addAll(org.getChildren());
}
再记录一种查询出一个父节点,如何把其所有的子节点查询出来,并设置好父子关系(最后返回是一个树结构的节点)
TreeTest root = get(taskId);
List<ConsultDivision> list = new ArrayList<>();
list.add(root);
while(!list.isEmpty()){
ConsultDivision cd = list.remove(0);
List<TreeTest> children = getByParentId(cd.getId());
cd.setChildren(children);
list.addAll(children);//继续找出子节点的子节点
}
return root;
再记录一种 树结构->列表结构的写法, 该写法可以保证树结构里原来的节点前后顺序
List<TreeNode> src= this.treeNodeService.select();
LinkedList<TreeNode> temp= new LinkedList<>(src);//树结构.size=1
List<TreeNode> des = new ArrayList<>();
//树结构转成列表结构并保持树结构的顺序
while (!temp.isEmpty()){
TreeNode remove = temp.remove(0);
List<TreeNode> children = remove.getChildren();
for(int i = children.size() - 1 ; i >= 0 ; i--){
temp.push(children.get(i));
}
des.add(remove);
}