接到需求需要更新父节点下所有子节点的数据,首先想到的就是递归。说实话,递归一直只是知道概念,一直还真没在实践中用过。
数据结构的样子大约如下:
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
思路就是这要,代码可能需要自己少做修改才能运行。
数据结构的样子大约如下:
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;
}
思路就是这要,代码可能需要自己少做修改才能运行。