java - 循环动态大小的数组

标签 java

简而言之,情况是这样的:

for(element : array)
{
   execute something that adds new elements to the array;
}

很明显,新添加的元素不会被处理。是否有一种技术可以处理每个元素?

这是这个问题的一个例子:我想,给定一个文件夹,遍历它的深度并将所有文件——无论是在它的 child 下还是在它的 child 的 child 下——直接移动到给定的文件夹下。之后删除所有空文件夹:

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移动到Parent Folder,忽略file2_1和file2_2这两个新添加到文件夹中的元素。发生这种情况是因为 ds1 已经为 for 循环初始化,新元素未添加到此数组/流,因此被忽略。

我想这对于有经验的编码人员来说并不困难,但我真的被卡住了。 :-)

最佳答案

Java 集合通过抛出 ConcurrentModificationException 来拒绝这个问题。 ;)

在这种特殊情况下,我倾向于推荐队列类型的结构;而不是使用 for 循环,而是重复地使元素出队并将更多元素添加到队列的后面。

关于java - 循环动态大小的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18454244/

相关文章:

java 。如何在每个第 n 个空格上拆分具有多个空格的字符串?

Java 或 Scala 插件框架

java - UnsupportedOperationException 尝试设置二维列表的值

java - 原因 : Not a v4. 0.0 POM

java - 滚动 Pane 中的多种文本颜色?

java - 联合测试: testing all possible boundaries?

java - Google App Engine/JPA 无法使用两个不同的 util.dates 进行排序和应用不等式过滤器

java - 在子类中抛出错误、异常和运行时异常

java - 如何创建所有参数都是可选的多搜索 SQL 语句?

java - Netty:空闲状态处理程序不显示 channel 是否空闲