日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

编写一个java类,用来表示出部队中 军 师 旅 团这种树状数据结构,使上级能检索到下级,下级也能检索到上级

發布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编写一个java类,用来表示出部队中 军 师 旅 团这种树状数据结构,使上级能检索到下级,下级也能检索到上级 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一 TreeLeader方法:
1.1首先把傳過來的list 集合遍歷
1.2 根據遍歷創建一個leader對象 用來接收各級leader對象的name 值
1.3 把這個對象添加到之前new 的ArrayList集合中
1.4 再獲取到當前對象的children的值 再調用本身
1.5 當前leader 對象沒有子成員時 不滿足當前方法參數所需要的條件 遞歸就會停止
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,“軍長”,0,1);
Leader l2=new Leader(2,“師長”,1,2);
Leader l3=new Leader(3,“旅長”,2,3);
Leader l4=new Leader(4,“團長”,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(“查詢前集合大小”+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(“查詢后集合大小”+list.size());

for(Leader leader:list) {String s="";for(int i=1;i<leader.getLevel();i++) {s=s+"\t";}System.out.println(s+" "+leader); }

}

private static List getChildList(List data2, Integer id, List childs) {
// TODO Auto-generated method stub
for(Leader leader:childs) {
if(ifChilds(childs,leader.getId()));

} return childs;

}

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;
}
}

樹形結構在數據庫的設計過程中是一種比較常見的模型,指的是各元素之間存在‘一對多’的結構模型。在樹形結構中,樹根結點沒有前驅結點,其余每個結點有且只有一個前驅結點。葉子結點沒有后續結點,其余每個結點的后續節點數可以是一個也可以是多個。

在數據庫中建好對應的表’t_classes’后,可以使用Java實現對該表的CRUD操作,下面介紹遞歸的方法實現對表中元素遍歷查詢,并將其有層次地顯示出來。

對應的Java語句如下所示:

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;

/**

  • 班級管理類
  • @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遵循一個原則:在哪里打開就在哪里關閉

} finally {DbUtil.close(conn);} }

//構成方法重載

public void displayClassList(Connection conn,int pid,int level) {

//level表示空格的個數,隨節點層數的增加而增加,使顯示結果具有層次感

//此處s用于使顯示結果更具有層次感

String s = "";PreparedStatement psta = null;ResultSet rs = null;String sql = "use 成績管理系統 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()) {

//打印輸出當前節點的信息,當前節點的父節點為參數pid

System.out.println(s + rs.getInt("class_id") + " " + rs.getString("class_name"));

//判斷當前節點是否為葉子節點

/如果不是葉子節點,說明當前節點下還有子節點,需要再次調用自身對子節點進行顯示,此時displayClassesList函數中應當傳入的參數為conn,由于要對子節點進行顯示,故pid應為當前節點的id,level隨著節點層數的變化變為level+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);} }

//主函數實現對顯示函數的調用

public static void main(String args[]) {new ClassesManager.displayClassesList(); }

}

由于之前在寫樹結構遍歷的時候都是 copy 的別人的代碼,想著把功能完成就行,并沒有真正理解如何實現的遍歷的,又怎么遞歸。前幾天嘗試著自己寫一個遍歷樹結構 List,其實很簡單,所以能自己動手,決不要 copy。先記錄一個查詢,增、刪、改后續補上。

正文
實現思路

  • 先從數據庫根據相應條件獲取出樹結構 List
  • 遍歷獲取到的數據將根節點取出
  • 遍歷剛取出的列表,調用遞歸方法將子節點數據存放到根節點里
  • 就是這么 easy,直接貼上代碼,細品
    1
    2
    3
    4
    5
    /** 從一個簡單的DTO文件開始 */
    public class TestDTO {
    // 自身 ID
    private Long id;
    // 名稱
    private String name;
    // 父節點 ID
    private Long parentId;
    // 子節點集合
    private List children;
    // 其他屬性

    // setter and getter 方法

    }
  • /** 實現類 */
    @Service
    public class TestServiceImpl implements TestService {

    // Repository 當然是獲取數據啦... private final TestRepository testRepository;// 這個是構造方法 public TestServiceImpl(TestRepository testRepository) {this.testRepository = testRepository; }// 獲取樹結構數據 public List<TestDTO> getList() {try {// 從數據庫里獲取 List 數據,如果有條件,則根據相應條件獲取,總之這里是一個樹結構的 listList<Test> tests = testRepository.findAll();// ??? 為什么不是 TestDTO 類型?這里 Test 是 Entity,從數據庫獲取的數據當前是用 Entity 類型接收啦!// 沒關系的,可以轉DTO// 定義一個空數組,用來存放最終的樹結構數據List<TestDTO> result = new ArrayList<>();// 第一步遍歷獲取到的數據,將根節點數據存放 result 里for (Test test: tests) {// 判斷是否是根節點,就是 parentId,這里是從 0 開始,如果 parentId 為 0 ,則表示根節點if (test.getParentId() == 0) {// 這里可以將 entity 轉為 DTO 存放// 如果字段不多可以直接使用 set get 方法來存取,就像這樣TestDTO testDTO = new TestDTO();testDTO.setId(test.getId);testDTO.setName(test.getName);testDTO.setParentId(test.getParentId);// 如果字段太多,超過5個以上,還是建議使用 mapper 方法來轉哦,具體如何使用 mapper 將 Entity 轉為 DTO 請移步下方鏈接result.add(testDTO);}}// 根節點添加完就需要添加每個節點的子節點了,這里需要調用 遞歸方法 getChildren();// 遍歷根節點數據,為其設置子節點集合for (TestDTO test: result) {// 獲取子節點數據,傳入 當前節點 id 和 所有 listList<TestDTO> childList = getChildren(test.getId(), tests);// 將獲取到的子節點集合添加到根節點里test.setChildren(childList);}// 將一層一層的樹結構數據返回吧!return result;} catch(Exception e) {// 這里可以拋個異常} }/*** 獲取子節點數據* @param id 父節點 ID* @param List<Test> tests 所有節點集合* @return 返回子節點列表*/ private List<TestDTO> getChildren(Long id, List<Test> tests) {// 存在子節點數據List<TestDTO> childList = new ArrayList<>();// 遍歷所有節點數據for (Test item : tests) {// 如果當前節點 ID 與父節點 ID 一致,表示當前數據是該節點的子節點if (item.getParentId().equals(String.valueOf(id))) {TestDTO testDTO = new TestDTO();testDTO.setId(test.getId);testDTO.setName(test.getName);testDTO.setParentId(test.getParentId);// 如果字段太多,超過5個以上,還是建議使用 mapper 方法來轉哦,具體如何使用 mapper 將 Entity 轉為 DTO 請移步下方鏈接childList.add(testDTO);}}// 重點來了,遞歸調用for (TestDTO item : childList) {// 調用自身方法,依次添加子節點數據item.setChildren(getChildren(item.getId(), tests));}// 如果當前節點無子節點數據添加空數據,遞歸退出if (childList.size() == 0) {return new ArrayList<>();}// 返回最終的子節點數據return childList; }

    }

    總結

    以上是生活随笔為你收集整理的编写一个java类,用来表示出部队中 军 师 旅 团这种树状数据结构,使上级能检索到下级,下级也能检索到上级的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 欧美一二三区 | 在线播放视频高清在线观看 | 国产老熟女一区二区三区 | 久久精品国产亚洲AV无码麻豆 | 免费黄网在线观看 | 精品午夜福利视频 | japanese强行粗暴 | 国产精品爱啪在线线免费观看 | 亚洲电影影音先锋 | 亚洲av人无码激艳猛片服务器 | 无码人妻久久一区二区三区 | 国产精品午夜久久 | 一区二区日韩精品 | 欧美一区三区三区高中清蜜桃 | 久久艹av| 日韩三级中文 | 国产一区二区三区在线视频 | 白嫩初高中害羞小美女 | 高hnp视频| 国产又大又黄又爽 | 天天操天天射天天 | 男女吻胸做爰摸下身 | 欧美人与动物xxxx | 中文字幕福利视频 | 中文字幕无码乱人伦 | 免费网站91 | 欧美婷婷精品激情 | 自拍偷拍第一页 | 一区二区三区四区五区av | 国产欧美精品在线观看 | 亚洲色图偷拍视频 | 国产午夜精品在线观看 | 操操操插插插 | 激情五月av | 蜜乳av网站 | 一区精品视频 | 日韩中文字幕免费在线观看 | 激情噜噜| 成人精品一区二区三区电影黑人 | 成人综合激情网 | 沟厕沟厕近拍高清视频 | 天堂va欧美ⅴa亚洲va一国产 | 四虎久久久 | 中文字幕色网 | 正在播放超嫩在线播放 | 欧美韩日精品 | 深夜福利国产精品 | 精品99久久 | 美女的奶胸大爽爽大片 | 国产chinese男男网站大全 | 久久亚洲国产精品 | 天天摸天天干天天操 | 欧美男人天堂网 | 肥熟女一区二区三肥熟女 | 91爱啪 | 天天做天天爱天天爽综合网 | 波多野结衣喷潮 | 一区二区三区免费在线 | 青青草原av | 男女污视频 | 丰满人妻翻云覆雨呻吟视频 | 久久久午夜 | 国产一级一区二区 | 久久久不卡国产精品一区二区 | 韩国一级一片高清免费观看 | 色欲AV无码精品一区二区久久 | 日本免费在线播放 | 亚洲三级小说 | 人人av在线 | 国产伦精品一区二区三区视频黑人 | 国产第一精品 | free性丰满69性欧美 | aaaaav| 亚洲精选在线 | 伊人avav| 成人精品免费视频 | 99精品视频免费在线观看 | 99久久久无码国产精品 | 国产av无码专区亚洲a∨毛片 | 国内毛片毛片毛片 | 小镇姑娘高清播放视频 | 67194av| 欧美三日本三级少妇三 | 久草手机在线 | 九月婷婷丁香 | 久久水蜜桃| 亚洲精品91在线 | 天天操 夜夜操 | 丰满少妇一级片 | 久久免费看毛片 | 福利片在线观看 | 精品人妻一区二区免费视频 | 精品人妻无码一区二区色欲产成人 | 欧美午夜精品一区二区三区电影 | 亚洲综合不卡 | 丝瓜av| xxx精品| 欧美大片免费观看网址 | 99热黄色|