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

目录
  • Java 递归遍历实现linux tree命令
    • 递归调用的函数traversal
    • printName函数
  • java实现zTree的遍历

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。

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

(0)

相关推荐

  • Java 递归查询部门树形结构数据的实践

    说明:在开发中,我们经常使用树形结构来展示菜单选项,如图: 那么我们在后端怎么去实现这样的一个功能呢? 1.数据库表:department 2.编写sql映射语句 <select id="selectDepartmentTrees" resultType="com.welb.entity.Department"> select * from department <where> <if test="updepartmentco

  • java非递归实现之二叉树的前中后序遍历详解

    二叉树的前中后序遍历 核心思想:用栈来实现对节点的存储.一边遍历,一边将节点入栈,在需要时将节点从栈中取出来并遍历该节点的左子树或者右子树,重复上述过程,当栈为空时,遍历完成. 前序遍历 //非递归 //根 左 右 class Solution { public List<Integer> preorderTraversal(TreeNode root) { //用数组来存储前序遍历结果 List<Integer> list = new ArrayList<>(); i

  • Java的递归算法详解

    目录 一.介绍 1.介绍 2.案例 二.迷宫问题 三.八皇后问题 四.汉诺塔问题 1.问题 2.思想 3.代码 总结 一.介绍 1.介绍 递归:递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁. 迭代和递归区别:迭代使用的是循环结构,递归使用的选择结构.使用递归能使程序的结构更清晰.更简洁.更容易让人理解,从而减少读懂代码的时间.其时间复杂度就是递归的次数. 但大量的递归调用会建立函数的副本,会消耗大量的时间和内存,而迭代则不需要此种付出

  • Java递归寻路实现,你真的理解了吗

    目录 引 使用递归计算阶乘 地图创建 核心 完整代码 总结 引 看懂这张图,方法调用方法,栈开新栈,递归尾结束要回到main栈,必须一级一级返回,每一次返回都是调用整个方法,调用完成栈被释放,直至回到栈底main递归结束并能够自己画出来,理解递归的运行机制,这是我手画的,不好看,你的呢,还不动起来 到这,如果上面的你都理解了,那么我相信你可以用递归写出 计算 n 的阶乘的程序了,什么,写不出,没有关系,我来补上,一定要理解在栈里运行机制 使用递归计算阶乘 public class Factori

  • Java中的什么场景使用递归,如何使用递归

    目录 什么是递归? 递归有什么优点? 迭代和递归的区别 递归的三个条件 什么场景下适合使用递归 场景一 场景二 总结 Java 递归算法 一.概述 二.应用场景 三.示例 四.实际示例 五.递归的缺点 什么是递归? 程序调用自身的编程技巧叫做递归. 递归有什么优点? 递归算法:代码简洁.清晰,并且容易验证正确性.在一定的程度上还能帮我们减少很多重复代码. 迭代和递归的区别 迭代是逐渐逼近,用新值覆盖旧值,直到满足条件后结束,不保存中间值,空间利用率高. 递归是将一个问题分解为若干相对小一点的问题

  • Java 关于递归的调用机制精细解读

    目录 1. 基本介绍: 2. 递归能解决什么问题? 3. 递归举例分析: 3.1 打印问题: 3.2 阶乘问题: 递归的重要规则: 方法的递归调用 1. 基本介绍: 简单地说,递归就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程者解决复杂问题的同时让代码变得简洁,化繁为简是其核心思想. 2. 递归能解决什么问题? 各种经典数学问题,如:八皇后问题,汉诺塔(河内塔),阶乘问题,迷宫问题,青蛙跳台阶,球和篮子的问题(Google编程大赛): 各种算法中也会使用到递归思想,比如快速排序(

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

    目录 Java 递归遍历实现linux tree命令 递归调用的函数traversal printName函数 java实现zTree的遍历 Java 递归遍历实现linux tree命令 看到介绍java file类的文章,有一个遍历文件夹的练习,遍历某个目录下所有文件,包括子目录.写了一个用栈实现的递归遍历. import java.io.File; import java.util.Stack; public class TraversalFile { public static void

  • Java递归遍历树形结构

    废话不多说了,直接给大家贴代码,具体代码如下所示: //菜单树形结构 public JSONArray treeMenuList(JSONArray menuList, int parentId) { JSONArray childMenu = new JSONArray(); for (Object object : menuList) { JSONObject jsonMenu = JSONObject.fromObject(object); int menuId = jsonMenu.ge

  • Java递归遍历文件目录代码实例

    这篇文章主要介绍了Java递归遍历文件目录代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在读取文件降序输出单词及其个数的基础上,将txt文件存入文件夹中,开始递归遍历文件目录,之后输出txt文件中的单词及其个数,仍然是降序排列. 代码如下 import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.Map

  • Java递归遍历树形结构的实现代码

    废话不多说了,直接给大家贴代码,具体代码如下所示: //菜单树形结构 public JSONArray treeMenuList(JSONArray menuList, int parentId) { JSONArray childMenu = new JSONArray(); for (Object object : menuList) { JSONObject jsonMenu = JSONObject.fromObject(object); int menuId = jsonMenu.ge

  • Java递归 遍历目录的小例子

    复制代码 代码如下: public static void main(String[] args) { File f = new File("D:\\test\\fsd");         listChids(f,0); } public static void listChids(File f,int level){ String preSrt = "";         for(int i=0;i<level;i++){ preSrt += "

  • Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】

    本文实例讲述了Java实现的二叉树常用操作.分享给大家供大家参考,具体如下: import java.util.ArrayDeque; import java.util.Queue; import java.util.Stack; //二叉树的建树,前中后 递归非递归遍历 层序遍历 //Node节点 class Node { int element; Node left; Node right; public Node() { } public Node(int element) { this.

  • java二叉树的非递归遍历

    二叉树的递归遍历比较简单,这里就不聊了.今天主要聊聊二叉树的非递归遍历,主要借助于"栈"后进先出的特性来保存节点的顺序,先序遍历和中序遍历相对来说比较简单,重点理解后序遍历. 1. 先看看节点类型: //二叉树的节点类型 private class Node{ int data; //节点值 Node leftChild; //左孩子 Node rightChild; //右孩子 public Node(int data) { this.data=data; } } 2.先序遍历. 非

  • java栈实现二叉树的非递归遍历的示例代码

    一般来说遍历二叉树用到递归,但是用Stack进行遍历也是一个不错的方法. 二叉树设置 class Node{ public int val; public Node left; public Node right; public Node(int v) { val=v; left=null; right=null; } } public class Main { public static void main(String[] args) { Node head =new Node(0); No

  • 通俗易懂讲解C语言与Java中二叉树的三种非递归遍历方式

    详解二叉树的三种非递归遍历方式(附C.java源码) 前言 二叉树的递归遍历方式很简单,三种递归遍历方式的区别,只是printf放的位置不一样而已,这里就不多讲了.把前序遍历代码贴在这里: //结点 struct Node { int val; struct Node* left, * right; }; //前序遍历 void pre(Node* root) { if (root == null) return; printf("%d ",root->val); pre(roo

  • Java开发深入分析讲解二叉树的递归和非递归遍历方法

    目录 前言 1.递归遍历 2.非迭代遍历 3.二叉树的统一迭代法 前言 二叉树的遍历方法分为前序遍历,中序遍历,后续遍历,层序遍历. 1.递归遍历 对于递归,就不得不说递归三要素:以前序遍历为例 递归入参参数和返回值 因为要打印出前序遍历节点的数值,所以参数里需要传入List在放节点的数值,除了这一点就不需要在处理什么数据了也不需要有返回值,所以递归函数返回类型就是void,代码如下: public void preorder(TreeNode root, List<Integer> resu

随机推荐