使用遞歸算法結(jié)合數(shù)據(jù)庫解析成Java樹形結(jié)構(gòu)的代碼解析
1、準(zhǔn)備表結(jié)構(gòu)及對應(yīng)的表數(shù)據(jù)
a、表結(jié)構(gòu):
create table TB_TREE ( CID NUMBER not null, CNAME VARCHAR2(50), PID NUMBER //父節(jié)點(diǎn) )
b、表數(shù)據(jù):
insert into tb_tree (CID, CNAME, PID) values (1, '中國', 0); insert into tb_tree (CID, CNAME, PID) values (2, '北京市', 1); insert into tb_tree (CID, CNAME, PID) values (3, '廣東省', 1); insert into tb_tree (CID, CNAME, PID) values (4, '上海市', 1); insert into tb_tree (CID, CNAME, PID) values (5, '廣州市', 3); insert into tb_tree (CID, CNAME, PID) values (6, '深圳市', 3); insert into tb_tree (CID, CNAME, PID) values (7, '海珠區(qū)', 5); insert into tb_tree (CID, CNAME, PID) values (8, '天河區(qū)', 5); insert into tb_tree (CID, CNAME, PID) values (9, '福田區(qū)', 6); insert into tb_tree (CID, CNAME, PID) values (10, '南山區(qū)', 6); insert into tb_tree (CID, CNAME, PID) values (11, '密云縣', 2); insert into tb_tree (CID, CNAME, PID) values (12, '浦東', 4);
2、TreeNode對象,對應(yīng)tb_tree
public class TreeNode implements Serializable {
private Integer cid;
private String cname;
private Integer pid;
private List nodes = new ArrayList();
public TreeNode() {
}
//getter、setter省略
}
3、測試數(shù)據(jù)
public class TreeNodeTest {
@Test
public void loadTree() throws Exception{
System.out.println(JsonUtils.javaToJson(recursiveTree(1)));
}
/**
* 遞歸算法解析成樹形結(jié)構(gòu)
*
* @param cid
* @return
* @author jiqinlin
*/
public TreeNode recursiveTree(int cid) {
//根據(jù)cid獲取節(jié)點(diǎn)對象(SELECT * FROM tb_tree t WHERE t.cid=?)
TreeNode node = personService.getreeNode(cid);
//查詢cid下的所有子節(jié)點(diǎn)(SELECT * FROM tb_tree t WHERE t.pid=?)
List childTreeNodes = personService.queryTreeNode(cid);
//遍歷子節(jié)點(diǎn)
for(TreeNode child : childTreeNodes){
TreeNode n = recursiveTree(child.getCid()); //遞歸
node.getNodes().add(n);
}
return node;
}
}
輸出的json格式如下:
{
"cid": 1,
"nodes": [
{
"cid": 2,
"nodes": [
{
"cid": 11,
"nodes": [
],
"cname": "密云縣",
"pid": 2
}
],
"cname": "北京市",
"pid": 1
},
{
"cid": 3,
"nodes": [
{
"cid": 5,
"nodes": [
{
"cid": 7,
"nodes": [
],
"cname": "海珠區(qū)",
"pid": 5
},
{
"cid": 8,
"nodes": [
],
"cname": "天河區(qū)",
"pid": 5
}
],
"cname": "廣州市",
"pid": 3
},
{
"cid": 6,
"nodes": [
{
"cid": 9,
"nodes": [
],
"cname": "福田區(qū)",
"pid": 6
},
{
"cid": 10,
"nodes": [
],
"cname": "南山區(qū)",
"pid": 6
}
],
"cname": "深圳市",
"pid": 3
}
],
"cname": "廣東省",
"pid": 1
},
{
"cid": 4,
"nodes": [
{
"cid": 12,
"nodes": [
],
"cname": "浦東",
"pid": 4
}
],
"cname": "上海市",
"pid": 1
}
],
"cname": "中國",
"pid": 0
}
總結(jié)
以上所述是小編給大家介紹的使用遞歸算法結(jié)合數(shù)據(jù)庫解析成Java樹形結(jié)構(gòu)的代碼解析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- Java遞歸遍歷樹形結(jié)構(gòu)的實(shí)現(xiàn)代碼
- 使用遞歸刪除樹形結(jié)構(gòu)的所有子節(jié)點(diǎn)(java和mysql實(shí)現(xiàn))
- Java創(chuàng)建樹形結(jié)構(gòu)算法實(shí)例代碼
- java實(shí)現(xiàn)省市區(qū)轉(zhuǎn)換成樹形結(jié)構(gòu)
- Java實(shí)現(xiàn)樹形結(jié)構(gòu)的示例代碼
- Java數(shù)據(jù)封裝樹形結(jié)構(gòu)代碼實(shí)例
- java轉(zhuǎn)樹形結(jié)構(gòu)工具類詳解
- 詳解Java遞歸實(shí)現(xiàn)樹形結(jié)構(gòu)的兩種方式
- Java接口返回省市區(qū)樹形結(jié)構(gòu)的實(shí)現(xiàn)
相關(guān)文章
Tk.mybatis零sql語句實(shí)現(xiàn)動態(tài)sql查詢的方法(4種)
有時候,查詢數(shù)據(jù)需要根據(jù)條件使用動態(tài)查詢,這時候需要使用動態(tài)sql,本文主要介紹了Tk.mybatis零sql語句實(shí)現(xiàn)動態(tài)sql查詢的方法,感興趣的可以了解一下2021-12-12
解決SpringCloud Gateway采用OpenFeign遠(yuǎn)程調(diào)用失敗的問題
在使用SpringCloud網(wǎng)關(guān)進(jìn)行統(tǒng)一鑒權(quán)和認(rèn)證過程中,通過OpenFeign遠(yuǎn)程調(diào)用鑒權(quán)服務(wù)器接口時可能會遇到遠(yuǎn)程調(diào)用失敗的問題,這通常是因?yàn)镠ttpMessageConverters沒有被正確注入到Spring容器中2024-09-09
Java中的main方法調(diào)用非靜態(tài)方法處理
這篇文章主要介紹了Java中的main方法調(diào)用非靜態(tài)方法處理,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06
Redisson分布式信號量RSemaphore的使用超詳細(xì)講解
這篇文章主要介紹了Redisson分布式信號量RSemaphore的使用,基于Redis的Redisson的分布式信號量RSemaphore采用了與java.util.concurrent.Semaphore相似的接口和用法2023-02-02
mybatis Invalid bound statement(not foun
這篇文章主要介紹了mybatis Invalid bound statement(not found)排坑記錄,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06

