java - Java在迭代时将项目添加到ArrayList
问题描述
我正在尝试迭代 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上阅读了很多答案(实际上这是其中之一),但似乎没有一个有效(显然我犯了一些错误)。
解决方案
如果你阅读了 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);
}
}
}
推荐阅读
- html - 我的条目旁边的按钮始终显示在条目下方
- javascript - 如何重新提交 HTML 表单
- javascript - OpenLayers 未加载 GeoJSON 图层数据
- php - 产品值未使用 php ajax 发送到 addProduct 页面
- c# - Chrome浏览器在使用Selenium Webdriver c#Nunit指定要下载的文件期间运行两次
- html - 在 IE 中按下选项卡时如何在文本框(UI)中显示全部内容
- apache-spark - 自定义文件格式以在写入时对数据进行分区
- kubernetes - kube-scheduler Liveness probe failed: Get http://127.0.0.1:10251/healthz: dial tcp 127.0.0.1:10251: connect: connection denied
- saml-2.0 - 任何人都可以提供实施 SAML 的分步流程吗
- android - 如何在我的 react-native 应用程序中接收启动完成的广播?