简而言之,情况如下:
for(element : array)
{
execute something that adds new elements to the array;
}
很明显,新添加的元素不会被处理。是否有一种技术可以处理每个元素?
这是这个问题的一个例子:我想,给定一个文件夹,遍历它的深度并将所有文件 - 无论是在它的孩子下还是在它的孩子的孩子下 - 直接在给定的文件夹下。之后删除所有空文件夹:
Parent Folder
- Level1Folder1
- file1_1
- Level1Folder2
- Level2Folder1
- file2_1
- file2_2
- file1_2
会变成:
Parent Folder
- file1_1
- file1_2
- file2_1
- file2_2
这是我的代码的药水:
public static void moveUpOneFolder(Path parent) {
try (DirectoryStream<Path> ds1 = Files.newDirectoryStream(parent)) {
for (Path p1 : ds1) {
//if this node is a dir, traverse its content
if (Files.isDirectory(p1)) {
moveUpOneFolder(p1);
}
//if this node is a file, move it up one level
else {
Path newFileName = parent.getParent().resolve(p1.getName(p1.getNameCount() - 2) + "_" + p1.getFileName());
Files.move(p1, newFileName);
}
Files.delete(p1);
}
} catch (IOException e) {
e.printStackTrace();
}
}
此递归不起作用,因为当执行到达 Level2Folder1 时,它将 file2_1 和 file 2_2 移动到 Level1Folder2,然后继续将 file1_2 移动到父文件夹,忽略 file2_1 和 file2_2,新添加到文件夹的元素。发生这种情况是因为 ds1 已经为 for 循环初始化,新元素未添加到此数组/流中,因此被忽略。
我想这对于经验丰富的编码人员来说并不难,但我真的被困住了。:-)