java 获取指定目录的文件和文件夹(算法、深度遍历、广度遍历、队列、栈)

java 获取指定目录的文件和文件夹

public class FilesUtils {
	public static void main(String[] args) {
		String path = "D:/test";
//		getAllFiles(path, null).forEach(System.out::println);
//		breadthTraversal(path).forEach(System.out::println);
//		breadthTraversalByLevel(path).forEach(System.out::println);
//		depthTraversalRecursively(new File(path));
		depthTraversalStack(path).forEach(System.out::println);
	}

	/**
	 * 获取指定目录下面的文件和文件夹(层次遍历/广度遍历,非递归,非队列)
	 */
	public static List<File> getAllFiles(String path, FileFilter fileFilter) {
		List<File> allFiles = new ArrayList<File>();
		File file = new File(path);
		if (file.exists()) {
			List<File> fileList = new ArrayList<File>();
			fileList.add(file);
			while (fileList.size() > 0) {
				allFiles.addAll(fileList);
				fileList = getNextLevelFiles(fileList, fileFilter);
			}
		}
		return allFiles;
	}

	private static List<File> getNextLevelFiles(List<File> fileList, FileFilter fileFilter) {
		List<File> nextLevelFiles = new ArrayList<File>();
		for (File file : fileList) {
			if (file.isDirectory()) {
				File[] childs = listFiles(file, fileFilter);
				if (childs != null) {
					for (File child : childs) {
						nextLevelFiles.add(child);
					}
				}
			}
		}
		return nextLevelFiles;
	}

	private static File[] listFiles(File file, FileFilter fileFilter) {
		return fileFilter == null ? file.listFiles() : file.listFiles(fileFilter);
	}

	/**
	 * 广度遍历/层次遍历(借助队列)
	 */
	public static List<File> breadthTraversal(String path) {
		List<File> allFiles = new ArrayList<File>();
		File node = new File(path);
		if (node.exists()) {
			Queue<File> queue = new LinkedList<>();
			queue.offer(node);
			while (!queue.isEmpty()) {
				node = queue.poll();
				allFiles.add(node);
				if (node.isDirectory()) {
					for (File child : node.listFiles()) {
						queue.offer(child);
					}
				}
			}
		}
		return allFiles;
	}

	/**
	 * 广度遍历/层次遍历(借助队列, 分层)
	 */
	public static List<File> breadthTraversalByLevel(String path) {
		List<File> allFiles = new ArrayList<>();
		File note = new File(path);
		if (note.exists()) {
			Queue<File> queue = new LinkedList<>();
			queue.offer(note);
			int level = 0;
			while (!queue.isEmpty()) {
				allFiles.add(new File("level = " + level++));// 仅表示分层,无其它意义
				for (int i = 0, size = queue.size(); i < size; i++) {
					note = queue.poll();
					allFiles.add(note);
					if (note.isDirectory()) {
						for (File child : note.listFiles()) {
							queue.offer(child);
						}
					}
				}
			}
		}
		return allFiles;
	}

	// 深度遍历(前序遍历,递归)
	public static void depthTraversalRecursively(File file) {
		System.out.println(file);
		if (file.isDirectory()) {
			for (File f : file.listFiles()) {
				depthTraversalRecursively(f);
			}
		}
	}

	// 深度遍历(前序遍历,非递归, 借助队列)
	public static List<File> depthTraversalStack(String path) {
		List<File> allFiles = new ArrayList<>();
		File node = new File(path);
		if (node.exists()) {
			Stack<File> stack = new Stack<File>();
			stack.push(node);
			while (!stack.isEmpty()) {
				node = stack.pop();
				allFiles.add(node);
				if (node.isDirectory()) {
					File[] children = node.listFiles();
					for (int i = children.length - 1; i >= 0; i--) {
						stack.push(children[i]);
					}
				}
			}
		}
		return allFiles;
	}
}

参考
1、深度遍历 java_Java 实现深度遍历和广度遍历数及其应用
https://blog.csdn.net/weixin_28746457/article/details/114345136
2、二叉树各种遍历算法Java 实现总结
https://blog.csdn.net/qq_41866626/article/details/120483860

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值