可用這個例子進(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))