最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用遞歸刪除樹(shù)形結(jié)構(gòu)的所有子節(jié)點(diǎn)(java和mysql實(shí)現(xiàn))

 更新時(shí)間:2017年10月07日 10:37:19   作者:李西召  
下面小編就為大家?guī)?lái)一篇使用遞歸刪除樹(shù)形結(jié)構(gòu)的所有子節(jié)點(diǎn)(java和mysql實(shí)現(xiàn))。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

1.業(yè)務(wù)場(chǎng)景

有如下樹(shù)形結(jié)構(gòu):
+—0
+—1
+—2
+—4
+—5
+—3

如果刪除某個(gè)父節(jié)點(diǎn),則其子節(jié)點(diǎn),以及其子節(jié)點(diǎn)的子節(jié)點(diǎn),以此類推,需要全部刪除。

2.Java實(shí)現(xiàn)

使用Map存儲(chǔ)樹(shù)形結(jié)構(gòu)的數(shù)據(jù),id為map的key,pid為樹(shù)形結(jié)構(gòu)的value。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;

public class TreeNodes {
  public static void main(String[] args) {
    test();
  }

  //測(cè)試removeSons方法
  public static void test(){

    //原始的Map
    Map<Integer, Integer> t=new HashMap<Integer, Integer>();
    //  ID PID
    t.put(1, 0);
    t.put(2, 1);
    t.put(3, 1);
    t.put(4, 2);
    t.put(5, 4);
    System.out.println("—— —— —— —— —— ——原始的Map —— —— —— —— —— —— ——");

    Set<Integer> keys=t.keySet();
    Iterator<Integer> iterator=keys.iterator();
    System.out.println("ID —— PID");
    while(iterator.hasNext()){
      Integer i=iterator.next();
      System.out.println(i+" —— "+t.get(i));  
    }

    int k=2;
    //遞歸刪除k的所有子節(jié)點(diǎn)
    System.out.println("—— —— —— —— —— ——?jiǎng)h除掉的節(jié)點(diǎn) —— —— —— —— —— —— ——");
    removeTreeNodes(t,k);
    //刪除k節(jié)點(diǎn)本身
    t.remove(k);
    System.out.println();
    System.out.println("—— —— —— —— —— —— 遞歸刪除["+k+"]的所有子節(jié)點(diǎn)后的Map —— —— ");

    iterator=keys.iterator();
    System.out.println("ID —— PID");
    while(iterator.hasNext()){
      Integer i=iterator.next();
      System.out.println(i+" —— "+t.get(i));
    }
  }

  //遞歸刪除所有的子節(jié)點(diǎn)
  public static Map<Integer, Integer> removeTreeNodes(Map<Integer, Integer> t,Integer k){ 
    //所有需要?jiǎng)h除的子節(jié)點(diǎn)
    List<Integer> sons=new ArrayList<Integer>();
    sons.add(k);
    List<Integer> temp=new ArrayList<Integer>();
    //循環(huán)遞歸刪除,所有以k為父節(jié)點(diǎn)的節(jié)點(diǎn)
    while(true){    
      for(Integer s:sons){
        Set<Integer> keys=t.keySet();
        Iterator<Integer> it=keys.iterator();
        while(it.hasNext()){
          Integer n=it.next();
          //如果父節(jié)點(diǎn)(即Map的value)為需要?jiǎng)h除的節(jié)點(diǎn),則記錄此節(jié)點(diǎn),并在Map中刪除
          if(t.get(n)==s){
            temp.add(n);
            it.remove();
            System.out.println("刪除了ID=["+n+"]的節(jié)點(diǎn),其父節(jié)點(diǎn)為["+s+"]");
          }
        }
      }

      //如果此節(jié)點(diǎn)包含子節(jié)點(diǎn),則將子節(jié)點(diǎn)賦值給sons;否則表示所有子節(jié)點(diǎn)已經(jīng)刪除,結(jié)束循環(huán)
      if(temp.size()>0){
        sons=temp;  
        temp=new CopyOnWriteArrayList<Integer>();
      }else{
        break;
      }
    }

    return t;
  }
}

3.SQL實(shí)現(xiàn)

利用存儲(chǔ)過(guò)程,將所有子節(jié)點(diǎn)存儲(chǔ)到臨時(shí)表里。

存儲(chǔ)過(guò)程執(zhí)行完后會(huì)產(chǎn)生一個(gè)臨時(shí)表,id為需要?jiǎng)h除的子節(jié)點(diǎn)id,nLevel 為節(jié)點(diǎn)深度,sCort 為排序字段。

建表并插入數(shù)據(jù):

CREATE TABLE treeNodes
(
 id INT PRIMARY KEY,
 pid INT
);
INSERT INTO treeNodes VALUES 
(1, 0),
(2, 1),
(3, 1),
(4, 2),
(5, 4);

創(chuàng)建并調(diào)用存儲(chǔ)過(guò)程:

DELIMITER//

DROP PROCEDURE IF EXISTS removeTreeNodes//

CREATE PROCEDURE removeTreeNodes(IN rootid INT)
 BEGIN
 DECLARE LEVEL INT ;
 DROP TABLE IF EXISTS tempNodes;
 CREATE TABLE tempNodes (
  id INT,
  nLevel INT,
  sCort VARCHAR(8000)
 );
 SET LEVEL=0 ;
 INSERT INTO tempNodes SELECT id,LEVEL,ID FROM treeNodes WHERE PID=rootid;
 WHILE ROW_COUNT()>0 DO
  SET LEVEL=LEVEL+1 ;
  INSERT INTO tempNodes 
  SELECT A.ID,LEVEL,CONCAT(B.sCort,A.ID) FROM treeNodes A,tempNodes B 
  WHERE A.PID=B.ID AND B.nLevel=LEVEL-1 ;
 END WHILE;
 END;
//
DELIMITER ;

CALL removeTreeNodes(0);

下面是需要?jiǎng)h除的子節(jié)點(diǎn):

SELECT CONCAT(SPACE(B.nLevel*2),'+--',A.id)
FROM treeNodes A,tempNodes B 
WHERE A.ID=B.ID 
ORDER BY B.sCort;

以上這篇使用遞歸刪除樹(shù)形結(jié)構(gòu)的所有子節(jié)點(diǎn)(java和mysql實(shí)現(xiàn))就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot自動(dòng)重連Redis的實(shí)現(xiàn)方法

    springboot自動(dòng)重連Redis的實(shí)現(xiàn)方法

    由于網(wǎng)絡(luò)或服務(wù)器問(wèn)題,Redis連接可能會(huì)斷開(kāi),導(dǎo)致應(yīng)用程序無(wú)法繼續(xù)正常工作,本文主要介紹了springboot自動(dòng)重連Redis的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • Java調(diào)用SQL腳本執(zhí)行常用的方法示例

    Java調(diào)用SQL腳本執(zhí)行常用的方法示例

    這篇文章主要給大家介紹了關(guān)于Java調(diào)用SQL腳本執(zhí)行常用的方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • Spring輕松解決循環(huán)依賴

    Spring輕松解決循環(huán)依賴

    Spring的解決循環(huán)依賴是有前置條件的,要解決循環(huán)依賴我們首先要了解Spring Bean對(duì)象的創(chuàng)建過(guò)程和依賴注入的方式。依賴注入方式,我之前的博客有所分享,大家可以在看本篇文章之前進(jìn)行一下小小的回顧
    2023-04-04
  • Spring Boot應(yīng)用Docker化的步驟詳解

    Spring Boot應(yīng)用Docker化的步驟詳解

    這篇文章主要給大家介紹了關(guān)于Spring Boot應(yīng)用Docker化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • 5分鐘搞懂java注解@Annotation的具體使用

    5分鐘搞懂java注解@Annotation的具體使用

    這篇文章主要介紹了5分鐘搞懂java注解@Annotation的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 關(guān)于Unsupported Media Type的解決方案

    關(guān)于Unsupported Media Type的解決方案

    在Web開(kāi)發(fā)中,415錯(cuò)誤表示服務(wù)器無(wú)法處理請(qǐng)求附帶的媒體格式,本文介紹了導(dǎo)致HTTP 415錯(cuò)誤的原因以及解決該問(wèn)題的兩種方法,首先,415錯(cuò)誤通常是由于客戶端請(qǐng)求的內(nèi)容類型與服務(wù)器期望的不匹配引起的,例如,服務(wù)器可能期望JSON格式的數(shù)據(jù)
    2024-10-10
  • Java pdu短信解碼全面解析

    Java pdu短信解碼全面解析

    本文是根據(jù)python的方法改寫(xiě)的pdu短信解碼,非常不錯(cuò),代碼簡(jiǎn)單易懂具有參考借鑒價(jià)值,感興趣的朋友一起看看吧
    2016-10-10
  • Java文件(io)編程之記事本開(kāi)發(fā)詳解

    Java文件(io)編程之記事本開(kāi)發(fā)詳解

    這篇文章主要為大家詳細(xì)介紹了Java文件(io)編程之記事本開(kāi)發(fā),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 十分鐘速懂java知識(shí)點(diǎn) System類

    十分鐘速懂java知識(shí)點(diǎn) System類

    這篇文章主要介紹了java知識(shí)點(diǎn)System類,根據(jù)一次面試總結(jié)的,可以十分鐘速懂System類,感興趣的小伙伴們可以參考一下
    2015-12-12
  • IntelliJ IDEA中代碼一鍵生成方法

    IntelliJ IDEA中代碼一鍵生成方法

    EasyCode 是基于 IntelliJ IDEA 開(kāi)發(fā)的代碼生成插件,支持自定義任意模板(Java,html,js,xml),這篇文章主要介紹了IntelliJ IDEA中代碼一鍵生成方法,需要的朋友可以參考下
    2020-02-02

最新評(píng)論

神池县| 秦皇岛市| 平顺县| 酒泉市| 穆棱市| 龙陵县| 阿拉善左旗| 衡东县| 清水河县| 吴旗县| 通化县| 龙泉市| 周至县| 嘉义县| 游戏| 张北县| 金坛市| 福鼎市| 广东省| 高密市| 响水县| 镇赉县| 通州区| 布尔津县| 荥阳市| 浦北县| 南溪县| 莲花县| 新巴尔虎右旗| 秭归县| 抚顺县| 改则县| 兴宁市| 弥勒县| 应城市| 黄浦区| 定结县| 镇安县| 泗水县| 莱阳市| 和静县|