使用自定义对象遍历 LinkedHashSet 并删除项目
Iterate through LinkedHashSet with custom Object and remove items
我有一个自定义的 Parcelable 对象 (ImageList),其中填充了图片文件的字符串名称 (test.jpeg)。
这些对象被添加到 LinkedHashSet。
图片也保存在设备的内部存储器中。
如果应用程序关闭,我想遍历 LinkedHashSet 并删除其中的所有项,同时删除内部存储中与它们关联的文件.
下面是我必须遍历 LinkedHashSet 和 remove/delete 项的代码。
但它只处理 LinkedHashSet 中的最后一项。
代码设置在Main的onDestroy()方法中Activity.
Iterator<ImageList> itr = imgList.iterator();
while(itr.hasNext()) {
File file = this.getFileStreamPath(itr.next().getImgName());
file.delete();
imgList.remove(itr.next());
}
在您的代码中,您在循环内调用了 iter.next()
方法两次。所以你会从列表中得到两个不同的对象。
即使代码可以在第一次调用中运行 itr.next().getImgName()
您正在检索一个对象,然后在 imgList.remove(itr.next());
中您检索另一个您删除的对象。实际上,在 itr.next().getImgName()
中检索到的对象永远不会被删除。
第二个问题是您在处理迭代器的内容时试图使用 imgList.remove(itr.next());
。这通常会抛出 java.util.ConcurrentModificationException
.
要在使用迭代器进行迭代期间删除元素,您应该使用迭代器的 remove
方法。
这里有一个小例子,说明如何在 Java 中基于迭代器的迭代中正确删除元素:
public static void main(String[] args) throws IOException {
Set<String> set = new LinkedHashSet<>();
set.add("hi");
set.add("there");
Iterator<String> iter = set.iterator();
while(iter.hasNext()) {
String next = iter.next();
System.out.println(next);
iter.remove();
}
System.out.println(set.size());
}
如果你运行这个代码,这将打印出:
hi
there
0
这是我建议您重新编写代码的建议:
Iterator<ImageList> itr = imgList.iterator();
while(itr.hasNext()) {
ImageList next = itr.next(); // Get the element from iterator
File file = this.getFileStreamPath(next.getImgName());
file.delete();
itr.remove(); // Remove from collection using iterator
}
你的迭代方法是错误的。它将抛出并发修改预期。在使用迭代器时,使用迭代器中的内置删除方法删除基础集合中的项目。(iterator.remove()) ,iterator.next() 将前进到下一个项目。 next() 的每次调用都应与 hasNext() 相关联。关闭应用程序时抛出任何错误?
使用这个例子:http://www.java-examples.com/remove-element-collection-using-java-iterator-example
我有一个自定义的 Parcelable 对象 (ImageList),其中填充了图片文件的字符串名称 (test.jpeg)。
这些对象被添加到 LinkedHashSet。 图片也保存在设备的内部存储器中。
如果应用程序关闭,我想遍历 LinkedHashSet 并删除其中的所有项,同时删除内部存储中与它们关联的文件.
下面是我必须遍历 LinkedHashSet 和 remove/delete 项的代码。
但它只处理 LinkedHashSet 中的最后一项。
代码设置在Main的onDestroy()方法中Activity.
Iterator<ImageList> itr = imgList.iterator();
while(itr.hasNext()) {
File file = this.getFileStreamPath(itr.next().getImgName());
file.delete();
imgList.remove(itr.next());
}
在您的代码中,您在循环内调用了 iter.next()
方法两次。所以你会从列表中得到两个不同的对象。
即使代码可以在第一次调用中运行 itr.next().getImgName()
您正在检索一个对象,然后在 imgList.remove(itr.next());
中您检索另一个您删除的对象。实际上,在 itr.next().getImgName()
中检索到的对象永远不会被删除。
第二个问题是您在处理迭代器的内容时试图使用 imgList.remove(itr.next());
。这通常会抛出 java.util.ConcurrentModificationException
.
要在使用迭代器进行迭代期间删除元素,您应该使用迭代器的 remove
方法。
这里有一个小例子,说明如何在 Java 中基于迭代器的迭代中正确删除元素:
public static void main(String[] args) throws IOException {
Set<String> set = new LinkedHashSet<>();
set.add("hi");
set.add("there");
Iterator<String> iter = set.iterator();
while(iter.hasNext()) {
String next = iter.next();
System.out.println(next);
iter.remove();
}
System.out.println(set.size());
}
如果你运行这个代码,这将打印出:
hi
there
0
这是我建议您重新编写代码的建议:
Iterator<ImageList> itr = imgList.iterator();
while(itr.hasNext()) {
ImageList next = itr.next(); // Get the element from iterator
File file = this.getFileStreamPath(next.getImgName());
file.delete();
itr.remove(); // Remove from collection using iterator
}
你的迭代方法是错误的。它将抛出并发修改预期。在使用迭代器时,使用迭代器中的内置删除方法删除基础集合中的项目。(iterator.remove()) ,iterator.next() 将前进到下一个项目。 next() 的每次调用都应与 hasNext() 相关联。关闭应用程序时抛出任何错误?
使用这个例子:http://www.java-examples.com/remove-element-collection-using-java-iterator-example