记录一种把树结构的对象全部取到一个集合中的写法

一个树结构的对象,层次不限.可用户自定义增加 如 

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);
        }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值