代码之家  ›  专栏  ›  技术社区  ›  Yes92

Java在迭代ArrayList时向其添加项

  •  0
  • Yes92  · 技术社区  · 6 年前

    我试图迭代一个ArrayList,并在这个循环中向列表中添加更多元素。我的代码的问题是,它不工作,我的第一个for循环只循环了一次(最初它只包含根目录)。

     for (ListIterator<File> iterator = dirs.listIterator(); iterator.hasNext(); ){
                for (File file : iterator.next().listFiles()) {
                    if (checkCondition(file)) {
                        fileList.add(file);
                    }
                    if (file.isDirectory()) {
                        iterator.add(file);
                    }
                }
            }
    

    其中,dirs是文件的数组列表。
    我读了很多关于stackoverflow的答案(事实上这是其中之一),但似乎没有一个有效(显然我犯了一些错误)。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Alex C.    6 年前

    如果阅读ListIterator的add(E)方法的Java文档,您会发现:

    新元素插入到隐式游标之前:对next的后续调用将不受影响,对previous的后续调用将返回新元素。

    这意味着调用next()将不允许您迭代新元素。

    出于不同的原因,在迭代期间修改列表不应使用迭代器或foreach循环。也许您应该保持简单,这应该可以做到(假设dirs是一个列表对象):

        for (int i = 0; i < dirs.size(); i++) {
            List<File> files = dirs.get(i).listFiles();
            for (File file : files) {
                if (checkCondition(file)) {
                    fileList.add(file);
                }
                if (file.isDirectory()) {
                    dirs.add(file);
                }
            }
        }
    
    推荐文章