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

网友投稿 310 2022-09-26


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

目录java 递归遍历实现linux tree命令递归调用的函数traversalprintName函数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 stack = new Stack();

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

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 stack = new Stack();

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

if(i == signNum - 1)

builder.append("|--");

else

builder.append(" ");

}

String str = buildeMwNWpnXr.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 children=new ArrayList();

//get set 省略

}

数据是这样的:

实现代码:

public List list(String name,Model model){

List categoryList = CategoryJDBC.getCategoryList();

HashMap 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 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。

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 stack = new Stack();

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

if(i == signNum - 1)

builder.append("|--");

else

builder.append(" ");

}

String str = buildeMwNWpnXr.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 children=new ArrayList();

//get set 省略

}

数据是这样的:

实现代码:

public List list(String name,Model model){

List categoryList = CategoryJDBC.getCategoryList();

HashMap 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 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。

if(i == signNum - 1)

builder.append("|--");

else

builder.append(" ");

}

String str = buildeMwNWpnXr.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 children=new ArrayList();

//get set 省略

}

数据是这样的:

实现代码:

public List list(String name,Model model){

List categoryList = CategoryJDBC.getCategoryList();

HashMap 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 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。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:OSPF虚拟链路实验(ospf虚拟链接)
下一篇:可变长子网掩码划分(可变长子网掩码划分办法)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~