Bob*_*obs 4 java iterator file
我正在写一个文件浏览器
ArrayList<File> folders = new ArrayList<File>(Arrays.asList(parent
.listFiles(filter)));
ListIterator<File> it = folders.listIterator();
while (it.hasNext()) {
File file = it.next();
if (file.isDirectory())
{
ArrayList<File> subFolders = new ArrayList<File>(
Arrays.asList(file
.listFiles(filter)));
for (File sub : subFolders) {
it.add(sub);
}
}
else
{
mediaFiles.add(file);
}
it.remove();
}
Run Code Online (Sandbox Code Playgroud)
当代码到达时it.remove();我得到以下错误:
02-04 23:32:47.670: E/AndroidRuntime(20230): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
02-04 23:32:47.670: E/AndroidRuntime(20230): at dalvik.system.NativeStart.main(Native Method)
02-04 23:32:47.670: E/AndroidRuntime(20230): Caused by: java.util.ConcurrentModificationException
02-04 23:32:47.670: E/AndroidRuntime(20230): at java.util.AbstractList$SimpleListIterator.remove(AbstractList.java:71)
Run Code Online (Sandbox Code Playgroud)
引用删除的文档:
从列表中删除next()或previous()(可选操作)返回的最后一个元素.此呼叫只能在每次呼叫下一次或上一次时进行一次.只有在最后一次调用next或previous之后没有调用add(E)时才能进行此操作.
有关删除方法的文档中引用的其他信息:
请注意,remove()和set(Object)方法没有根据光标位置定义; 它们被定义为对next()或previous()调用返回的最后一个元素进行操作.
因此,如果您add(E)在迭代中调用,则remove()也无法调用.
我会把remove()方法放在else声明中:
else
{
mediaFiles.add(file);
it.remove();
}
Run Code Online (Sandbox Code Playgroud)
这样你打电话就不会打电话 add(E)
但是,remove方法是可选的,因为您可以在不调用的next()情况下不断调用该方法remove().所以你可以完全省略它,这可能是你想要的结果.
| 归档时间: |
|
| 查看次数: |
117 次 |
| 最近记录: |