遞歸無限下級例子蛔趴,根據(jù)需求修改后可用于分類例朱,會員等樹結(jié)構(gòu)這方面

可用這個例子進(jìn)行測試遞歸無限下級洒嗤,但是要考慮

可能會內(nèi)存溢出:如果一個人有100代的下級渔隶,下級總共有20W怎么辦?

如果是有這種情況的話婉弹,就不要遞歸無限下級了镀赌,就一級一級的找就行了商佛,而不是一次性遞歸所有良姆。

或者網(wǎng)友們有其他方案的話幔戏,可以評論留言指點,謝謝韩玩!

代碼:

public static class LeJiHe{

private? Lele;

? ? private? Listchildren;

? ? public LegetLe() {

return le;

? ? }

public void setLe(Le le) {

this.le = le;

? ? }

public ListgetChildren() {

return children;

? ? }

public void setChildren(List children) {

this.children = children;

? ? }

}

public static class Le{

//等級 0 會員1 vip 2 svip

? ? private Integerpin;

? ? //會員編號

? ? private StringdistNo;

? ? //上級編號

? ? private StringsponsorNo;

? ? //名稱

? ? private StringdistName;

? ? public IntegergetPin() {

return pin;

? ? }

public void setPin(Integer pin) {

this.pin = pin;

? ? }

public StringgetDistNo() {

return distNo;

? ? }

public void setDistNo(String distNo) {

this.distNo = distNo;

? ? }

public StringgetSponsorNo() {

return sponsorNo;

? ? }

public void setSponsorNo(String sponsorNo) {

this.sponsorNo = sponsorNo;

? ? }

public StringgetDistName() {

return distName;

? ? }

public void setDistName(String distName) {

this.distName = distName;

? ? }

}

static class XTreeKit {

public static ListformatTree(List LeList) {

List menuList =new ArrayList();

? ? ? ? ? ? Le m0=new Le();

? ? ? ? ? ? m0.setDistNo("003");

? ? ? ? ? ? m0.setSponsorNo("001");

? ? ? ? ? ? m0.setPin(1);

? ? ? ? ? ? m0.setDistName("中山市");

? ? ? ? ? ? LeJiHe grid =getXTreeGrid(m0, LeList);

? ? ? ? ? ? menuList.add(grid);

? ? ? ? return menuList;

? ? }

/**

? ? * 遞歸查找子菜單

? ? */

? ? public static ListgetChild(String id, List rootMenu) {

List childList =new ArrayList();

? ? ? ? for (Le root : rootMenu) {

// 遍歷所有節(jié)點,將父菜單編碼與傳過來的編碼進(jìn)行比較击狮、若相同則繼續(xù)查看該節(jié)點下是否還有子節(jié)點

? ? ? ? ? ? if (!StringUtils.isEmpty(root.getSponsorNo())) {

if (root.getSponsorNo().equals(id)) {

LeJiHe grid =getXTreeGrid(root, rootMenu);

? ? ? ? ? ? ? ? ? ? childList.add(grid);

? ? ? ? ? ? ? ? }

}

}

return childList;

? ? }

//構(gòu)建 XTreeGrid(實體對象)

? ? public static LeJiHegetXTreeGrid(Le ps, List permissions){

LeJiHe x =new LeJiHe();

? ? ? ? x.setLe(ps);

? ? ? ? x.setChildren(getChild(ps.getDistNo(),permissions));? //遞增遍歷所有子節(jié)點(無限層級)

? ? ? ? return x;

? ? }

}

public static void main(String[] args) {

Le m1=new Le();

? ? m1.setDistNo("006");

? ? m1.setSponsorNo("003");

? ? m1.setPin(2);

? ? m1.setDistName("東區(qū)");

? ? Le m2=new Le();

? ? m2.setDistNo("007");

? ? m2.setSponsorNo("003");

? ? m2.setPin(1);

? ? m2.setDistName("石岐區(qū)");

? ? Le m3=new Le();

? ? m3.setDistNo("008");

? ? m3.setSponsorNo("006");

? ? m3.setPin(0);

? ? m3.setDistName("東區(qū)一街");

? ? Le m4=new Le();

? ? m4.setDistNo("009");

? ? m4.setSponsorNo("006");

? ? m4.setPin(1);

? ? m4.setDistName("東區(qū)二街");

? ? Le m5=new Le();

? ? m5.setDistNo("010");

? ? m5.setSponsorNo("007");

? ? m5.setPin(1);

? ? m5.setDistName("石歧一街");

? ? Le m6=new Le();

? ? m6.setDistNo("011");

? ? m6.setSponsorNo("007");

? ? m6.setPin(2);

? ? m6.setDistName("石歧二街");

? ? Le m7=new Le();

? ? m7.setDistNo("012");

? ? m7.setSponsorNo("008");

? ? m7.setPin(0);

? ? m7.setDistName("東區(qū)一街廣場");

? ? Le m8=new Le();

? ? m8.setDistNo("013");

? ? m8.setSponsorNo("008");

? ? m8.setPin(0);

? ? m8.setDistName("東區(qū)一街大堂");

? ? Le m9=new Le();

? ? m9.setDistNo("014");

? ? m9.setSponsorNo("009");

? ? m9.setPin(0);

? ? m9.setDistName("東區(qū)二街廣場");

? ? List leList=new ArrayList();

? ? leList.add(m1);

? ? leList.add(m2);

? ? leList.add(m3);

? ? leList.add(m4);

? ? leList.add(m5);

? ? leList.add(m6);

? ? leList.add(m7);

? ? leList.add(m8);

? ? leList.add(m9);

? ? List grid = XTreeKit.formatTree(leList);

? ? Map map =new HashMap();

? ? map.put("code",200);

? ? map.put("msg","查詢成功");

? ? map.put("content",grid);

? ? String jsonString = JSON.toJSONString(map);

? ? System.out.println("jsonString:" + jsonString);

}

控制臺輸出:

jsonString:{"msg":"查詢成功","code":200,"content":[{"children":[{"children":[{"children":[{"children":[],"le":{"distName":"東區(qū)一街廣場","distNo":"012","pin":0,"sponsorNo":"008"}},{"children":[],"le":{"distName":"東區(qū)一街大堂","distNo":"013","pin":0,"sponsorNo":"008"}}],"le":{"distName":"東區(qū)一街","distNo":"008","pin":0,"sponsorNo":"006"}},{"children":[{"children":[],"le":{"distName":"東區(qū)二街廣場","distNo":"014","pin":0,"sponsorNo":"009"}}],"le":{"distName":"東區(qū)二街","distNo":"009","pin":1,"sponsorNo":"006"}}],"le":{"distName":"東區(qū)","distNo":"006","pin":2,"sponsorNo":"003"}},{"children":[{"children":[],"le":{"distName":"石歧一街","distNo":"010","pin":1,"sponsorNo":"007"}},{"children":[],"le":{"distName":"石歧二街","distNo":"011","pin":2,"sponsorNo":"007"}}],"le":{"distName":"石岐區(qū)","distNo":"007","pin":1,"sponsorNo":"003"}}],"le":{"distName":"中山市","distNo":"003","pin":1,"sponsorNo":"001"}}]}

格式化后:

{

"msg": "查詢成功",

"code": 200,

"content": [{

"children": [{

"children": [{

"children": [{

"children": [],

"le": {

"distName": "東區(qū)一街廣場",

"distNo": "012",

"pin": 0,

"sponsorNo": "008"

}

}, {

"children": [],

"le": {

"distName": "東區(qū)一街大堂",

"distNo": "013",

"pin": 0,

"sponsorNo": "008"

}

}],

"le": {

"distName": "東區(qū)一街",

"distNo": "008",

"pin": 0,

"sponsorNo": "006"

}

}, {

"children": [{

"children": [],

"le": {

"distName": "東區(qū)二街廣場",

"distNo": "014",

"pin": 0,

"sponsorNo": "009"

}

}],

"le": {

"distName": "東區(qū)二街",

"distNo": "009",

"pin": 1,

"sponsorNo": "006"

}

}],

"le": {

"distName": "東區(qū)",

"distNo": "006",

"pin": 2,

"sponsorNo": "003"

}

}, {

"children": [{

"children": [],

"le": {

"distName": "石歧一街",

"distNo": "010",

"pin": 1,

"sponsorNo": "007"

}

}, {

"children": [],

"le": {

"distName": "石歧二街",

"distNo": "011",

"pin": 2,

"sponsorNo": "007"

}

}],

"le": {

"distName": "石岐區(qū)",

"distNo": "007",

"pin": 1,

"sponsorNo": "003"

}

}],

"le": {

"distName": "中山市",

"distNo": "003",

"pin": 1,

"sponsorNo": "001"

}

}]

}

上面只是測試類储狭,可以直接運行,沒有從數(shù)據(jù)庫里面查詢出來慈参,可以到時在代碼自己改驮配。

建表和表數(shù)據(jù)sql:

SET NAMES utf8mb4;

SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------

-- Table structure for tb

-- ----------------------------

DROP TABLE IF EXISTS `tb`;

CREATE TABLE `tb`? (

? `dist_no` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,

? `sponsorNo` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,

? `pin` int(2) DEFAULT NULL,

? `dist_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL

) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------

-- Records of tb

-- ----------------------------

INSERT INTO `tb` VALUES ('000', NULL, 2, '中國');

INSERT INTO `tb` VALUES ('001', '000', 2, '廣東省');

INSERT INTO `tb` VALUES ('002', '001', 2, '廣州市');

INSERT INTO `tb` VALUES ('003', '001', 1, '中山市');

INSERT INTO `tb` VALUES ('004', '002', 1, '天河區(qū)');

INSERT INTO `tb` VALUES ('005', '002', 1, '海珠區(qū)');

INSERT INTO `tb` VALUES ('006', '003', 2, '東區(qū)');

INSERT INTO `tb` VALUES ('007', '003', 1, '石岐區(qū)');

INSERT INTO `tb` VALUES ('008', '006', 0, '東區(qū)一街');

INSERT INTO `tb` VALUES ('009', '006', 1, '東區(qū)二街');

INSERT INTO `tb` VALUES ('010', '007', 1, '石歧一街');

INSERT INTO `tb` VALUES ('011', '007', 2, '石歧二街');

INSERT INTO `tb` VALUES ('012', '008', 1, '東區(qū)一街廣場');

INSERT INTO `tb` VALUES ('013', '008', NULL, '東區(qū)一街大堂');

INSERT INTO `tb` VALUES ('014', '009', 0, '東區(qū)二街廣場');

SET FOREIGN_KEY_CHECKS = 1;

上面的java類的的那些對象集合,就是用以下的sql進(jìn)行查詢出來的涮阔,查上級編號是003的無限下級記錄。

select dist_no,

? ? ? ? sponsorNo,

pin,

dist_name

from? ? (select * from tb

? ? ? ? order by sponsorNo, dist_no) tb_sorted,

? ? ? ? (select @pv := '003') initialisation

where? find_in_set(sponsorNo, @pv)

and? ? length(@pv := concat(@pv, ',', dist_no))

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市伟阔,隨后出現(xiàn)的幾起案子皱炉,更是在濱河造成了極大的恐慌,老刑警劉巖合搅,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異廊谓,居然都是意外死亡麻削,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門叠荠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來榛鼎,“玉大人鳖孤,你說我怎么就攤上這事』器ⅲ” “怎么了平匈?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵忍燥,是天一觀的道長。 經(jīng)常有香客問我灾前,道長哎甲,這世上最難降的妖魔是什么饲嗽? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任貌虾,我火速辦了婚禮,結(jié)果婚禮上衔憨,老公的妹妹穿的比我還像新娘践图。我一直安慰自己,他們只是感情好码党,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布眉厨。 她就那樣靜靜地躺著兽狭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪服球。 梳的紋絲不亂的頭發(fā)上销钝,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天蒸健,我揣著相機(jī)與錄音似忧,去河邊找鬼丈秩。 笑死,一個胖子當(dāng)著我的面吹牛饺著,可吹牛的內(nèi)容都是我干的肠牲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼渡嚣,長吁一口氣:“原來是場噩夢啊……” “哼绝葡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起藏畅,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤墓赴,失蹤者是張志新(化名)和其女友劉穎航瞭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體章办,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡藕届,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年休偶,在試婚紗的時候發(fā)現(xiàn)自己被綠了踏兜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片八秃。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡昔驱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纳本,到底是詐尸還是另有隱情繁成,我是刑警寧澤秕豫,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站祠墅,受9級特大地震影響毁嗦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜克锣,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一袭祟、第九天 我趴在偏房一處隱蔽的房頂上張望捞附。 院中可真熱鬧,春花似錦胆绊、人聲如沸压状。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽传轰。三九已至慨蛙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間期贫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工玛臂, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留迹冤,地道東北人泡徙。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓莉兰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親糖荒。 傳聞我的和親對象是個殘疾皇子寂嘉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容