递归取得当前节点下所有子节点

接到需求需要更新父节点下所有子节点的数据,首先想到的就是递归。说实话,递归一直只是知道概念,一直还真没在实践中用过。


数据结构的样子大约如下:
MBCBKM0000009,二,,开发直接成本,10,1,5,1,
MBCBKM0000010,2,,开发前期准备费,11,2,3,1,MBCBKM0000009
MBCBKM0000011,2.1,,勘察设计费,12,3,0,1,MBCBKM0000010
MBCBKM0000012,2.1.1,,勘察丈量费,13,4,0,1,MBCBKM0000011
MBCBKM0000013,2.1.1.1,,规划测绘费,14,5,0,1,MBCBKM0000012
MBCBKM0000014,2.1.1.2,,红线坐标测量费,15,5,0,1,MBCBKM0000012
MBCBKM0000018,2.1.2,,规划设计费,20,4,0,1,MBCBKM0000011
MBCBKM0000019,2.1.2.1,,拿地方案,21,5,0,1,MBCBKM0000018
MBCBKM0000020,2.1.2.2,,概念设计费,22,5,0,1,MBCBKM0000018
MBCBKM0000021,2.1.2.3,,方案设计费,23,5,0,1,MBCBKM0000018
MBCBKM0000027,2.1.3,,其他(专项设计费),32,4,0,1,MBCBKM0000011
MBCBKM0000028,2.1.3.1,,精装修设计费,33,5,0,1,MBCBKM0000027
MBCBKM0000029,2.1.3.2,,泛光照明设计费,34,5,0,1,MBCBKM0000027
MBCBKM0000030,2.1.3.3,,幕墙设计费,35,5,0,1,MBCBKM0000027
MBCBKM0000042,2.2,,报批报建费,60,3,0,1,MBCBKM0000010
MBCBKM0000043,2.2.1,,报批报建费,61,4,0,1,MBCBKM0000042
MBCBKM0000044,2.2.1.1,, 政府报建费,62,5,0,1,MBCBKM0000043
MBCBKM0000045,2.2.1.2,,城市基础设施配套费,63,5,0,1,MBCBKM0000043

其中第一个字段是当前节点值,最后一个为父节点的值。要求就是取得给定节点下所有子节点。

递归的概念就不多说了,参数呢,就是第一个是父节点的集合,第二个是数据的集合,第三个是返回的结果子节点集合。

大致思路就是,传入父节点和需要遍历的集合,然后取得当前父节点的的子节点集合;同时遍历传入的数据集合,取得属于当前父节点的数据集合,并从当前数据集合中删除。然后将得到的自己点集合及剩余数据集作为参数递归调用本身。

代码如下:

	/**
	 * 递归取得当前目标成本所有子子节点
	 * @return 子节点集合
	 */
	public List<String> getChildNode(List<String> parentNode,List<Entity> list,List<String> resultNode) {
		if(parentNode==null || parentNode.size()<=0) return parentNode;
		
		List<String> result = new ArrayList<String>();
		List<Entity> remove = new ArrayList<Entity>();
		//遍历传来的父节点集合
		for (String key : parentNode) {
			//遍历数据集
			for (Entity entity: list) {
				if(key != null && key.equals(entity.getParentId())){
					result.add(entity.ChildId());
					resultNode.add(entity.ChildId());
					remove.add(entity);
				}
			}
			list.removeAll(remove);
		}
		//递归调用
		getChildNode(result,list,resultNode);
		return result;
	}


思路就是这要,代码可能需要自己少做修改才能运行。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值