【问题标题】:Java Adding items to ArrayList while iterating itJava在迭代时将项目添加到ArrayList
【发布时间】:2018-10-21 00:43:26
【问题描述】:

我正在尝试迭代一个 ArrayList,并在此循环期间向列表中添加更多元素。我的代码的问题是它不起作用,我的第一个 for 循环只循环一次(起初它 dirs 只包含根目录)。

 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 是文件的 ArrayList。
我在stackoverflow上阅读了很多答案(实际上这是其中之一),但似乎没有一个有效(显然我犯了一些错误)。

【问题讨论】:

  • 您没有发布exception details,也没有说明问题所在。但是,根据您的代码,我建议关闭此问题,因为它可能与 Concurrent Modification exception 重复
  • dirs 有没有可能只有一个元素?
  • 是的,在第一次迭代时它只有根目录,然后我想循环遍历它的子目录,所以我尝试将它们添加到列表中。
  • 你能检查它是否真的有子目录吗?也许在第二个if 条件中添加打印语句
  • 我已经这样做了,是的,它有子目录。

标签: java loops arraylist listiterator


【解决方案1】:

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

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

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

由于不同的原因,在迭代期间修改列表不应该使用迭代器或 foreach 循环来完成。也许你应该保持简单,这应该可以解决问题(假设 dirs 是一个 List 对象):

    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);
            }
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    相关资源
    最近更新 更多