最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 遞歸遍歷實(shí)現(xiàn)linux tree命令方式

 更新時(shí)間:2021年09月18日 09:45:10   作者:bsbhenry  
這篇文章主要介紹了Java 遞歸遍歷實(shí)現(xiàn)linux tree命令方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Java 遞歸遍歷實(shí)現(xiàn)linux tree命令

看到介紹java file類的文章,有一個(gè)遍歷文件夾的練習(xí),遍歷某個(gè)目錄下所有文件,包括子目錄。寫了一個(gè)用棧實(shí)現(xiàn)的遞歸遍歷。

import java.io.File;
import java.util.Stack;
public class TraversalFile {
	
	public static void main(String[] args) {
		File dir = new File("D:/Study/code/Java/TraversalFile");
		traversal(dir,1);
	}
 
	public TraversalFile() {
		// TODO Auto-generated constructor stub
	}
	
	public static void traversal(File file,int depth) {
		printName(file, depth);
		File[] fileArray = file.listFiles();
		
		Stack<File> stack = new Stack<File>();
		for(File f:fileArray) {
			if(f.isFile()) {
				printName(f, depth + 1);				
			}
			else {
				stack.add(f);
			}
		}
		
		while(stack.isEmpty() == false) {
			traversal(stack.pop(),depth + 1);
		}
	}
	
	public static void printName(File f, int signNum) {
		StringBuilder builder = new StringBuilder();
		//signNum個(gè)sign
		
		for(int i=0;i<signNum;i++){		   
		   if(i == signNum - 1)
			   builder.append("|--"); 
		   else
			   builder.append("  ");
		}
		
		String str = builder.toString();
		System.out.println(str + f.getName());
	}
}

效果如下

遞歸調(diào)用的函數(shù)traversal

	public static void traversal(File file,int depth) {
		printName(file, depth);
		File[] fileArray = file.listFiles();
		
		Stack<File> stack = new Stack<File>();
		for(File f:fileArray) {
			if(f.isFile()) {
				printName(f, depth + 1);				
			}
			else {
				stack.add(f);
			}
		}
		
		while(stack.isEmpty() == false) {
			traversal(stack.pop(),depth + 1);
		}
	}

函數(shù)首先調(diào)用了一個(gè)printName函數(shù),用來打印當(dāng)前傳入文件的名字,包括前面的線條,然后遍歷當(dāng)前文件的子文件,如果是文件類型就打印出來,但是深度+1,深度是用來通過打印字符顯示出文件層次的,如果是目錄就入棧。遍歷結(jié)束后就出棧并遞歸調(diào)用 traversal,直到所有文件打印完畢。

不使用stack也可以實(shí)現(xiàn)遍歷,但是fileArray里面可能文件和目錄是混著的,顯示出來會比較亂,如果先打印文件,目錄都入棧,之后處理,就可以區(qū)別開。

如果不考慮文件和目錄是混著輸出,下面這種寫法更簡潔。

如果是文件就返回,是目錄就遞歸調(diào)用。

	public static void traversal(File file,int depth) {
		printName(file, depth);		
		if (file.isFile())
			return;		
		File[] fileArray = file.listFiles();
		for(File f:fileArray) {
			traversal(f, depth + 1);
		}
	}

結(jié)果如下

printName函數(shù)

	public static void printName(File f, int signNum) {
		StringBuilder builder = new StringBuilder();
		//signNum個(gè)sign
		
		for(int i=0;i<signNum;i++){		   
		   if(i == signNum - 1)
			   builder.append("|--"); 
		   else
			   builder.append("  ");
		}
		
		String str = builder.toString();
		System.out.println(str + f.getName());
	}

文件或目錄名前根據(jù)層級填充空格,最后用 |--緊接名字。

java實(shí)現(xiàn)zTree的遍歷

entity代碼:

public class CategoryVO {
	private Integer id;
	private Integer pId;
	private String name;
	private String url;
	private List<CategoryVO> children=new ArrayList<CategoryVO>();
	//get set 省略
}

數(shù)據(jù)是這樣的:

在這里插入圖片描述

實(shí)現(xiàn)代碼:

public List<CategoryVO> list(String name,Model model){
		List<CategoryVO> categoryList = CategoryJDBC.getCategoryList();
		
		HashMap<Integer, CategoryVO> tmpMap = new HashMap<>(); // 所有對象存放到map中
		for (CategoryVO categoryVO : categoryList) {
			tmpMap.put(categoryVO.getId(), categoryVO);
		}
		
		ArrayList<CategoryVO> arrayList = new ArrayList<>(); // 結(jié)果list,之所以用list,是考慮到有多個(gè)根目錄的情況
		for (CategoryVO categoryVO : categoryList) {  // 遍歷所有元素,放到對應(yīng)的父節(jié)點(diǎn)
			if(tmpMap.get(categoryVO.getpId())!=null && categoryVO.getId()!=categoryVO.getpId() ){
				CategoryVO categoryVO2 = tmpMap.get(categoryVO.getpId()); //map中找到父節(jié)點(diǎn)
				List<CategoryVO> children = categoryVO2.getChildren(); 
				children.add(categoryVO); // 添加到父節(jié)點(diǎn)的children里
				categoryVO2.setChildren(children); 
				tmpMap.put(categoryVO2.getId(), categoryVO2); //重置添加children后的map
				
			}else{
				arrayList.add(categoryVO);
			}
		}
		return categoryList;
	}

該方法只用了2次遍歷。

第一次,遍歷所有對象,放到tmpMap中。

第二次,遍歷所有對象,通過tmpMap找到每個(gè)節(jié)點(diǎn)對應(yīng)的父節(jié)點(diǎn),并添加到父節(jié)點(diǎn)children中。然后父節(jié)點(diǎn)再放回map。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java數(shù)據(jù)存儲的“雙子星”對決(Map和Set的區(qū)別)

    Java數(shù)據(jù)存儲的“雙子星”對決(Map和Set的區(qū)別)

    文章主要介紹了Java中Map和Set兩種數(shù)據(jù)結(jié)構(gòu)的定義、實(shí)現(xiàn)、方法及應(yīng)用場景,Map用于存儲鍵值對,鍵唯一,值可重復(fù);Set用于存儲唯一元素,無序,兩者都提供了豐富的操作方法,如添加、刪除、查找等,感興趣的朋友一起看看吧
    2025-02-02
  • spring?security?自定義Provider?如何實(shí)現(xiàn)多種認(rèn)證

    spring?security?自定義Provider?如何實(shí)現(xiàn)多種認(rèn)證

    這篇文章主要介紹了spring?security?自定義Provider實(shí)現(xiàn)多種認(rèn)證方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 關(guān)于request.getRequestDispatcher().forward()的妙用及DispatcherType對Filter配置的影響

    關(guān)于request.getRequestDispatcher().forward()的妙用及DispatcherType

    這篇文章主要介紹了關(guān)于request.getRequestDispatcher().forward()的妙用及DispatcherType對Filter配置的影響,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java調(diào)用瀏覽器打開網(wǎng)頁完整實(shí)例

    Java調(diào)用瀏覽器打開網(wǎng)頁完整實(shí)例

    這篇文章主要介紹了Java調(diào)用瀏覽器打開網(wǎng)頁的方法,以完整實(shí)例形式分析了java打開網(wǎng)頁的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • 基于常用json框架介紹和Jackson返回結(jié)果處理方式

    基于常用json框架介紹和Jackson返回結(jié)果處理方式

    這篇文章主要介紹了基于常用json框架介紹和Jackson返回結(jié)果處理方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java中過濾器、監(jiān)聽器和攔截器的區(qū)別詳解

    Java中過濾器、監(jiān)聽器和攔截器的區(qū)別詳解

    這篇文章主要介紹了Java中過濾器、監(jiān)聽器和攔截器的區(qū)別詳解,有些朋友可能不了解過濾器、監(jiān)聽器和攔截器的區(qū)別,本文就來詳細(xì)講一下,相信看完你會有所收獲,需要的朋友可以參考下
    2024-01-01
  • IDEA2020.3創(chuàng)建web工程的完整步驟

    IDEA2020.3創(chuàng)建web工程的完整步驟

    這篇文章主要給大家介紹了關(guān)于IDEA2020.3創(chuàng)建web工程的完整步驟,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Java線程池中的Future實(shí)現(xiàn)詳解

    Java線程池中的Future實(shí)現(xiàn)詳解

    這篇文章主要介紹了Java線程池中的Future實(shí)現(xiàn)詳解, FutureTask是一個(gè)任務(wù),FutureTask繼承了Runnable、Callable, 通過FutureTask可以獲取到任務(wù)執(zhí)行的狀態(tài),任務(wù)執(zhí)行完成完成后,將結(jié)構(gòu)通過Future接口返回,調(diào)用者可以調(diào)用Future#get()方法獲取到數(shù)據(jù),需要的朋友可以參考下
    2023-10-10
  • Docker?快速部署Springboot項(xiàng)目超詳細(xì)最新版

    Docker?快速部署Springboot項(xiàng)目超詳細(xì)最新版

    這篇文章主要介紹了Docker?快速部署Springboot項(xiàng)目超詳細(xì)最新版的相關(guān)資料,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • Java實(shí)現(xiàn)貪吃蛇游戲源碼

    Java實(shí)現(xiàn)貪吃蛇游戲源碼

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)貪吃蛇游戲源碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11

最新評論

台中市| 北宁市| 阳信县| 灵丘县| 石楼县| 太和县| 双柏县| 巴东县| 金湖县| 牙克石市| 西城区| 乌鲁木齐县| 南乐县| 门源| 龙州县| 玉田县| 鹤庆县| 南陵县| 舟曲县| 扶余县| 寻甸| 海兴县| 扬中市| 绥宁县| 石河子市| 沅江市| 慈溪市| 米脂县| 吉林省| 贡觉县| 察隅县| 兴文县| 大渡口区| 绥阳县| 吉木乃县| 鸡西市| 平原县| 长沙市| 金寨县| 聊城市| 天等县|