1. 程式人生 > >遞迴取得當前節點下所有子節點

遞迴取得當前節點下所有子節點

接到需求需要更新父節點下所有子節點的資料,首先想到的就是遞迴。說實話,遞迴一直只是知道概念,一直還真沒在實踐中用過。


資料結構的樣子大約如下:
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;
	}


思路就是這要,程式碼可能需要自己少做修改才能執行。

相關推薦

取得當前節點所有節點

接到需求需要更新父節點下所有子節點的資料,首先想到的就是遞迴。說實話,遞迴一直只是知道概念,一直還真沒在實踐中用過。 資料結構的樣子大約如下: MBCBKM0000009,二,,開發直接成本,10,1,5,1, MBCBKM0000010,2,,開發前期準備費,11,2,3

儲存過程樹結構實現(某一節點所有節點)三種方式

最近專案中碰到需要寫遞迴,就特意實現了集中實現方式,總結一下~ 情景:通過給出的機構id,得到該機構id以及所有的子機構資訊,機構id是UUID; 通過三種方式去實現,親自實現過,可直接用: 第一種:通過多次操作資料庫獲得所有子機構資訊。實現如下: /** * 遞

SQL 語句查詢 With AS 查詢所有節點

create table #EnterPrise (   Department nvarchar(50),--部門名稱   ParentDept nvarchar(50),--上級部門   DepartManage nvarchar(30)--部門經理 ) insert into #EnterPri

刪除樹形結構的所有節點(java和mysql實現)

1.業務場景 有如下樹形結構: +—0 +—1 +—2 +—4 +—5 +—3 如果刪除某個父節點,則其

VS2010-MFC獲取某個樹控制元件某個樹節點所有節點的文字

MFC專案開發過程中需要獲取某個樹控制元件下某個樹節點下所有的子節點的文字,新增到某個組合框上,網上的相關程式碼差不多是遍歷整個樹控制元件,所以自己就封裝了一個函式,用於獲取指定樹節點下的所有的子節點

Oracle plsql統計所有節點節點&內容個數——start with connect by prior用法

有些情況下,在存有層級關係的表中,id欄位值本身會包含層級關係,例如每兩位表示一級。 要想只統計某個或某幾個層級節點下子節點+內容個數,就需要使用類似like ‘01%’的過濾條件即可。 例如select count(1) from test_category t wh

mysql 歸查找菜單節點所有節點

bsp nbsp 節點 != rom div 查找 sta concat SELECT idFROM ( SELECT t1.id, IF ( find_in_set(parent_id,

[SQL]T-Sql 歸查詢(給定節點所有節點所有節點的方法)

select IT rod nbsp pos UC with var 數據 -- 查找所有父節點with tab as( select Type_Id,ParentId,Type_Name from Sys_ParamType_V2_0 where Type_Id=31

向上查詢父節點歸查詢和向查詢節點歸查詢函數

層級關系 AR 遞歸查詢 sta mpc tid 時間 獲取 由於 本文為博主原創,未經允許不得轉載: 由於在項目中用到了向上查詢父節點的遞歸查詢和向下查詢子節點查詢的遞歸查詢,由於在實現過程中,寫遞歸查詢的sql函數 花費了較長的時間,所以在此總結一下,兩種遞歸查詢的函數

方法輸出目錄所有的檔名

# !/bin/bash function echo_name() { #shell會執行反引號中的內容(命令) for file in `ls $1` do if [ -d $1'/'$file ] then echo_name $1'/'$file else ech

Java讀取檔案路徑所有檔名稱並儲存為Txt文件

本文用遞迴的方法實現讀取一個路徑下面的所有檔案並將檔名稱儲存到Txt檔案中,親測可用。 遞迴讀取檔案路徑下的所有檔案: /** * 遞迴讀取檔案路徑下的所有檔案 * * @param path * @param fileNameList

T-SQL 語句——CTE 獲取當前使用者及其所有下級使用者

CREATE TABLE #t( Id INT NOT NULL PRIMARY KEY IDENTITY, Name NVARCHAR(20) NOT NULL, ParentId INT NU

利用Python下載資料夾所有檔案

最近想備份網站,但是php下載檔案的大小是有大小限制的,而我也懶得裝ftp再下載了,就想著暫時弄個二級域名站,然後用python(python3)的requests庫直接下載網站根目錄下的所有檔案以及資料夾。(0-0就是這麼任性) 1.安裝requests庫 pip instal

列印指定路徑所有檔案內容到指定檔案裡

# -*- coding: utf-8 -*- """遞迴列印指定路徑下所有檔案 Usage: printDirectory <printFilePath> <saveFilePath> """ from docopt import docopt imp

linux查詢某目錄所有檔案包含某字串的命令

linux下查詢某目錄下所有檔案包含某字串的命令: 從檔案內容查詢匹配指定字串的行: $ grep "被查詢的字串" 檔名 從檔案內容查詢與正則表示式匹配的行: $ grep –e “正則表示式” 檔名 查詢時不區分大小寫: $ grep –i "被查詢的字串"

Python遍歷目錄所有檔案查詢指定檔案

之前看到網上有人說『os.path.isdir()判斷必須寫絕對路徑』,當時心想Python不是有迭代上下文嗎,為什麼不行?遂作本文驗證之 程式碼部分 考慮用一個path變數指代當前遍歷元素的絕對路徑(正確做法) def search(ro

Axis2中的操作OMElement【取得某一個節點節點

private static OMElement value = null; public static OMElement getTheNodeValue(OMElement in, String nodeName) { try

Xpath當前節點尋找父節點節點

HTML的結構如下: <section class="AutoTest"> <a title="xpath" href="#"></a> <

查詢-簡單查詢父類及所有

   專案中需要遞迴查詢,簡單的寫了一個,記錄一下。   具體查詢sql就不貼出來了,每個業務都不一樣,但是都差不多,基本上都是根據父類搜尋下面的子類。    public Result sele

獲取指定目錄所有的指定格式的檔案

遞迴獲取目錄下所有的txt結尾的檔案的絕對路徑 package com; import java.io.File; /* * 把g:\java\JavaSE目錄下所有的txt結尾的檔案的絕對