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

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

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

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

有如下樹形結(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存儲樹形結(jié)構(gòu)的數(shù)據(jù),id為map的key,pid為樹形結(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();
  }

  //測試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é)點(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é)點(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é)點(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)

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

存儲過程執(zhí)行完后會產(chǎn)生一個(gè)臨時(shí)表,id為需要刪除的子節(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)用存儲過程:

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é)點(diǎn):

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

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

相關(guān)文章

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

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

    由于網(wǎng)絡(luò)或服務(wù)器問題,Redis連接可能會斷開,導(dǎo)致應(yīng)用程序無法繼續(xù)正常工作,本文主要介紹了springboot自動重連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)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • Spring輕松解決循環(huán)依賴

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

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

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

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

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

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

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

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

    Java pdu短信解碼全面解析

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

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

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

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

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

    IntelliJ IDEA中代碼一鍵生成方法

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

最新評論

阳江市| 北宁市| 都匀市| 瑞丽市| 桐乡市| 新田县| 昌平区| 宁国市| 若羌县| 仁化县| 德阳市| 海丰县| 麻阳| 吉林市| 施甸县| 北京市| 洪湖市| 海门市| 梧州市| 灌南县| 西平县| 永泰县| 铜陵市| 昭苏县| 蒙城县| 秦皇岛市| 东乡族自治县| 东阿县| 淮滨县| 平果县| 台东市| 敦煌市| 光山县| 施秉县| 昌宁县| 竹北市| 和政县| 光山县| 普兰店市| 秦安县| 寿光市|