编写一个java类,用来表示出部队中 军 师 旅 团这种树状数据结构,使上级能检索到下级,下级也能检索到上级
一 TreeLeader方法:
1.1首先把傳過(guò)來(lái)的list 集合遍歷
1.2 根據(jù)遍歷創(chuàng)建一個(gè)leader對(duì)象 用來(lái)接收各級(jí)leader對(duì)象的name 值
1.3 把這個(gè)對(duì)象添加到之前new 的ArrayList集合中
1.4 再獲取到當(dāng)前對(duì)象的children的值 再調(diào)用本身
1.5 當(dāng)前l(fā)eader 對(duì)象沒(méi)有子成員時(shí) 不滿(mǎn)足當(dāng)前方法參數(shù)所需要的條件 遞歸就會(huì)停止
public class Leader {
private Integer id;
private String name;
private Integer parentId;
private Integer level;
public Leader(Integer id, String name, Integer parentId, Integer level) {
super();
this.id = id;
this.name = name;
this.parentId = parentId;
this.level = level;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getParentId() {
return parentId;
}
public void setParentId(Integer parentId) {
this.parentId = parentId;
}
public Integer getLevel() {
return level;
}
public void setLevel(Integer level) {
this.level = level;
}
}
public class Test {
static List data=new ArrayList();
static {
Leader l1=new Leader(1,“軍長(zhǎng)”,0,1);
Leader l2=new Leader(2,“師長(zhǎng)”,1,2);
Leader l3=new Leader(3,“旅長(zhǎng)”,2,3);
Leader l4=new Leader(4,“團(tuán)長(zhǎng)”,3,4);
data.add(l1);
data.add(l2);
data.add(l3);
data.add(l4);
}
public static void main(String[] args) {
List list = new ArrayList<>();
System.out.println(“查詢(xún)前集合大小”+data.size());
for(Leader l:data) {
if(l.getParentId()==0) {
list.add(l);
if(ifChilds(data,l.getId())) {
List childs = new ArrayList<>();
childs=getChildList(data,l.getId(),childs);
list.addAll(childs);
}
}
}
System.out.println(“查詢(xún)后集合大小”+list.size());
}
private static List getChildList(List data2, Integer id, List childs) {
// TODO Auto-generated method stub
for(Leader leader:childs) {
if(ifChilds(childs,leader.getId()));
}
private static boolean ifChilds(List list, Integer Pid ) {
// TODO Auto-generated method stub
boolean flag=false;
for(Leader leader:list) {
flag=true;
break;
}
return flag;
}
}
樹(shù)形結(jié)構(gòu)在數(shù)據(jù)庫(kù)的設(shè)計(jì)過(guò)程中是一種比較常見(jiàn)的模型,指的是各元素之間存在‘一對(duì)多’的結(jié)構(gòu)模型。在樹(shù)形結(jié)構(gòu)中,樹(shù)根結(jié)點(diǎn)沒(méi)有前驅(qū)結(jié)點(diǎn),其余每個(gè)結(jié)點(diǎn)有且只有一個(gè)前驅(qū)結(jié)點(diǎn)。葉子結(jié)點(diǎn)沒(méi)有后續(xù)結(jié)點(diǎn),其余每個(gè)結(jié)點(diǎn)的后續(xù)節(jié)點(diǎn)數(shù)可以是一個(gè)也可以是多個(gè)。
在數(shù)據(jù)庫(kù)中建好對(duì)應(yīng)的表’t_classes’后,可以使用Java實(shí)現(xiàn)對(duì)該表的CRUD操作,下面介紹遞歸的方法實(shí)現(xiàn)對(duì)表中元素遍歷查詢(xún),并將其有層次地顯示出來(lái)。
對(duì)應(yīng)的Java語(yǔ)句如下所示:
package com.njupt.exam.manager;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.njupt.exam.util.DbUtil;
/**
- 班級(jí)管理類(lèi)
- @author hzy
*/
public class ClassesManager {
public void dispalyClassesList() {Connection conn = null;try {conn = DbUtil.getConnection();displayClassesList(conn,0,0);} catch(Exception e) {e.printStackTrace();//此處conn遵循一個(gè)原則:在哪里打開(kāi)就在哪里關(guān)閉
} finally {DbUtil.close(conn);} }//構(gòu)成方法重載
public void displayClassList(Connection conn,int pid,int level) {//level表示空格的個(gè)數(shù),隨節(jié)點(diǎn)層數(shù)的增加而增加,使顯示結(jié)果具有層次感
//此處s用于使顯示結(jié)果更具有層次感
String s = "";PreparedStatement psta = null;ResultSet rs = null;String sql = "use 成績(jī)管理系統(tǒng) select * from t_class where pid = ?";for(int i=0;i<level;i++)s += " ";try {psta = conn.prepareStatement(sql);psta.setInt(1,pid);rs = psta.executeQuery();while(rs.next()) {//打印輸出當(dāng)前節(jié)點(diǎn)的信息,當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)為參數(shù)pid
System.out.println(s + rs.getInt("class_id") + " " + rs.getString("class_name"));//判斷當(dāng)前節(jié)點(diǎn)是否為葉子節(jié)點(diǎn)
/如果不是葉子節(jié)點(diǎn),說(shuō)明當(dāng)前節(jié)點(diǎn)下還有子節(jié)點(diǎn),需要再次調(diào)用自身對(duì)子節(jié)點(diǎn)進(jìn)行顯示,此時(shí)displayClassesList函數(shù)中應(yīng)當(dāng)傳入的參數(shù)為conn,由于要對(duì)子節(jié)點(diǎn)進(jìn)行顯示,故pid應(yīng)為當(dāng)前節(jié)點(diǎn)的id,level隨著節(jié)點(diǎn)層數(shù)的變化變?yōu)閘evel+1/
if(rs.getInt("leaf") == 0) { displayClassesList(conn,rs.getInt("class_id"),level+1)} }} catch(SQLException e1) {e1.printStackTrace();} finally {DbUtil.close(rs);DbUtil.close(psta);} }//主函數(shù)實(shí)現(xiàn)對(duì)顯示函數(shù)的調(diào)用
public static void main(String args[]) {new ClassesManager.displayClassesList(); }}
由于之前在寫(xiě)樹(shù)結(jié)構(gòu)遍歷的時(shí)候都是 copy 的別人的代碼,想著把功能完成就行,并沒(méi)有真正理解如何實(shí)現(xiàn)的遍歷的,又怎么遞歸。前幾天嘗試著自己寫(xiě)一個(gè)遍歷樹(shù)結(jié)構(gòu) List,其實(shí)很簡(jiǎn)單,所以能自己動(dòng)手,決不要 copy。先記錄一個(gè)查詢(xún),增、刪、改后續(xù)補(bǔ)上。
正文
實(shí)現(xiàn)思路
1
2
3
4
5
/** 從一個(gè)簡(jiǎn)單的DTO文件開(kāi)始 */
public class TestDTO {
// 自身 ID
private Long id;
// 名稱(chēng)
private String name;
// 父節(jié)點(diǎn) ID
private Long parentId;
// 子節(jié)點(diǎn)集合
private List children;
// 其他屬性
…
// setter and getter 方法
…
}
/** 實(shí)現(xiàn)類(lèi) */
@Service
public class TestServiceImpl implements TestService {
}
總結(jié)
以上是生活随笔為你收集整理的编写一个java类,用来表示出部队中 军 师 旅 团这种树状数据结构,使上级能检索到下级,下级也能检索到上级的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 特战旅php 视频_15个特战旅精锐大比
- 下一篇: 战队口号霸气押韵8字_枪战游戏战队名字大