我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java 递归遍历实现linux tree命令方式

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java 递归遍历实现linux tree命令方式

Java 递归遍历实现linux tree命令

看到介绍java file类的文章,有一个遍历文件夹的练习,遍历某个目录下所有文件,包括子目录。写了一个用栈实现的递归遍历。


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个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());
	}
}

效果如下

递归调用的函数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);
		}
	}

函数首先调用了一个printName函数,用来打印当前传入文件的名字,包括前面的线条,然后遍历当前文件的子文件,如果是文件类型就打印出来,但是深度+1,深度是用来通过打印字符显示出文件层次的,如果是目录就入栈。遍历结束后就出栈并递归调用 traversal,直到所有文件打印完毕。

不使用stack也可以实现遍历,但是fileArray里面可能文件和目录是混着的,显示出来会比较乱,如果先打印文件,目录都入栈,之后处理,就可以区别开。

如果不考虑文件和目录是混着输出,下面这种写法更简洁。

如果是文件就返回,是目录就递归调用。


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

结果如下

printName函数


	public static void printName(File f, int signNum) {
		StringBuilder builder = new StringBuilder();
		//signNum个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());
	}

文件或目录名前根据层级填充空格,最后用 |--紧接名字。

java实现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 省略
}

数据是这样的:

在这里插入图片描述

实现代码:


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<>(); // 结果list,之所以用list,是考虑到有多个根目录的情况
		for (CategoryVO categoryVO : categoryList) {  // 遍历所有元素,放到对应的父节点
			if(tmpMap.get(categoryVO.getpId())!=null && categoryVO.getId()!=categoryVO.getpId() ){
				CategoryVO categoryVO2 = tmpMap.get(categoryVO.getpId()); //map中找到父节点
				List<CategoryVO> children = categoryVO2.getChildren(); 
				children.add(categoryVO); // 添加到父节点的children里
				categoryVO2.setChildren(children); 
				tmpMap.put(categoryVO2.getId(), categoryVO2); //重置添加children后的map
				
			}else{
				arrayList.add(categoryVO);
			}
		}
		return categoryList;
	}

该方法只用了2次遍历。

第一次,遍历所有对象,放到tmpMap中。

第二次,遍历所有对象,通过tmpMap找到每个节点对应的父节点,并添加到父节点children中。然后父节点再放回map。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java 递归遍历实现linux tree命令方式

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何在Java中使用递归遍历二叉树?(Java中如何实现递归遍历二叉树?)

递归遍历二叉树是Java中高效的遍历方法,可访问所有节点并保持树的层次结构。前序、中序和后序遍历是三种不同类型的递归遍历,具有各自的访问顺序。递归遍历的特点包括代码简洁性、易于实现和O(n)的时间复杂度,但需要栈空间且代码复用性较差。递归遍历适用于需要全面或部分遍历树的情况,特别是需要处理树的层级结构时。
如何在Java中使用递归遍历二叉树?(Java中如何实现递归遍历二叉树?)
2024-04-02

java栈如何实现二叉树的非递归遍历

这篇文章主要介绍了java栈如何实现二叉树的非递归遍历,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。二叉树设置class Node{public int val;public
2023-06-14

怎么用Python递归式实现二叉树前序,中序,后序遍历

今天小编给大家分享一下怎么用Python递归式实现二叉树前序,中序,后序遍历的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。记
2023-06-29

Java递归实现树形结构的方式有哪些

这篇文章主要介绍“Java递归实现树形结构的方式有哪些”,在日常操作中,相信很多人在Java递归实现树形结构的方式有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java递归实现树形结构的方式有哪些”的疑
2023-07-04

PyQt5 QTreeWidget树形结构递归遍历当前所有节点的实现方法是什么

这篇文章主要介绍“PyQt5 QTreeWidget树形结构递归遍历当前所有节点的实现方法是什么”,在日常操作中,相信很多人在PyQt5 QTreeWidget树形结构递归遍历当前所有节点的实现方法是什么问题上存在疑惑,小编查阅了各式资料,
2023-06-21

详解Java递归实现树形结构的两种方式

在开发的过程中,很多业务场景需要一个树形结构的结果集进行前端展示,也可以理解为是一个无限父子结构,常见的有报表指标结构、菜单结构等,这篇文章主要介绍了Java递归实现树形结构的两种方式,需要的朋友可以参考下
2022-11-13

Linux调整历史命令的实现方法是什么

小编今天带大家了解Linux调整历史命令的实现方法是什么,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“Linux调整历史命令的实现方
2023-06-28

如何进行Java 数据结构中二叉树前中后序遍历非递归的具体实现

本篇文章为大家展示了如何进行Java 数据结构中二叉树前中后序遍历非递归的具体实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、前序遍历1.题目描述给你二叉树的根节点 root ,返回它节点值的
2023-06-25

Java递归调用如何实现数字的逆序输出方式

这篇文章主要介绍了Java递归调用如何实现数字的逆序输出方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-15

图解二叉树的三种遍历方式及java实现代码

二叉树(binary tree)是一颗树,其中每个节点都不能有多于两个的儿子。1.二叉树节点作为图的特殊形式,二叉树的基本组成单元是节点与边;作为数据结构,其基本的组成实体是二叉树节点(binary tree node),而边则对应于节点之
2023-05-31

Linux echo命令的使用及三种实现方式

先给大家介绍下linux中echo命令的使用 echo是打印变量的值或者给定的字符串,比如,输入echo hello或者echo "hello"都是在控制台打印出hello单词但是我们需要把打印出来的字符串记录到文本文件中,就需要>和>>命
2022-06-04

linux命令实现音频格式转换和拼接的方法

安装FFmpeg flaceric@ray:~$ sudo apt install FFmpeg flac安装lame faaceric@ray:~$ sudo apt install lame faac将一个后缀为.ape格式的视频转换成
2022-06-04

编程热搜

目录