Android 使用自定义对象迭代LinkedHashSet并删除项

Android 使用自定义对象迭代LinkedHashSet并删除项,android,linkedhashset,Android,Linkedhashset,我有一个自定义的可包裹对象(ImageList),它被图片文件的字符串名(test.jpeg)填充 这些对象将添加到LinkedHashSet。 图片还保存在设备的内部存储器中 如果应用程序已关闭,我希望通过LinkedHashSet迭代,删除其中的所有项目,同时删除内部存储器中与这些项目关联的文件 下面是我必须遍历LinkedHashSet并移除/删除项目的代码 但它只处理LinkedHashSet中的最后一项 代码在主活动的onDestroy()方法中设置 Iterator<Image

我有一个自定义的可包裹对象(ImageList),它被图片文件的字符串名(test.jpeg)填充

这些对象将添加到LinkedHashSet。 图片还保存在设备的内部存储器中

如果应用程序已关闭,我希望通过LinkedHashSet迭代,删除其中的所有项目,同时删除内部存储器中与这些项目关联的文件

下面是我必须遍历LinkedHashSet并移除/删除项目的代码

但它只处理LinkedHashSet中的最后一项

代码在主活动的onDestroy()方法中设置

Iterator<ImageList> itr = imgList.iterator();

        while(itr.hasNext()) {

            File file = this.getFileStreamPath(itr.next().getImgName());
            file.delete();
            imgList.remove(itr.next());
}
Iterator itr=imgList.Iterator();
while(itr.hasNext()){
File File=this.getFileStreamPath(itr.next().getImgName());
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());
}
我建议您重新编写代码:

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 itr=imgList.Iterator();
while(itr.hasNext()){
ImageList next=itr.next();//从迭代器获取元素
File File=this.getFileStreamPath(next.getImgName());
delete();
itr.remove();//使用迭代器从集合中删除
}

您的迭代方法是错误的。它将抛出并发修改预期。使用迭代器时,请使用迭代器中的内置移除方法移除基础集合中的项。(迭代器.remove()),迭代器.next()将前进到下一项。next()的每个调用都应该与hasNext()关联。关闭应用程序时抛出任何错误


使用此示例:

Many thx作为示例和解释gil!工作起来很有魅力。
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
}