最近代码面试,发现不少人文件遍历在可以百度api的情况下都写不顺溜。感觉是不是这个问题太难了?顺手写了四个,好像还是挺简单的,起码比树的遍历要简单不少
public static void main(String[] args) {
recursionDeep(new File("/Users/destiny2018/proj"));
recursionWild(Arrays.asList(new File("/Users/destiny2018/proj")));
iteratorDeep();
iteratorWild ();
}
public static void iteratorDeep () {
Stack<File> stack = new Stack();
File rootFile = new File("/Users/destiny2018/proj");
stack.push(rootFile);
while(!stack.empty()) {
File file = stack.pop();
if (file.isDirectory()) {
File [] subFiles = file.listFiles();
for (File subFile : subFiles) {
stack.push(subFile);
}
} else {
System.out.println(file.getPath());
}
}
}
public static void iteratorWild () {
Queue<File> queue = new LinkedList<>();
File rootFile = new File("/Users/destiny2018/proj");
queue.add(rootFile);
int level = 0;
while(!queue.isEmpty()) {
System.out.println("levle" + (++ level));
int stackSize = queue.size();
for (int i = 0; i < stackSize; i ++) {
File file = queue.poll();
if (file.isDirectory()) {
File [] subFiles = file.listFiles();
for (File subFile : subFiles) {
queue.add(subFile);
}
} else {
System.out.println(file.getPath());
}
}
}
}
public static void recursionDeep(File rootFile) {
if(rootFile.isDirectory()) {
File[] files = rootFile.listFiles();
for (File file : files) {
recursionDeep(file);
}
} else {
System.out.println(rootFile.getPath());
}
}
public static void recursionWild(List<File> toRecList) {
if (toRecList == null || toRecList.isEmpty()) {
return;
}
List<File> nextRecList = new ArrayList<>();
// 处理本层级
for (File file : toRecList) {
if (file.isDirectory()) {
for (File subFile : file.listFiles()) {
nextRecList.add(subFile);
}
} else {
System.out.println(file.getPath());
}
}
toRecList = null;
recursionWild(nextRecList);
}