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

时间:2018-01-28 14:20:48

标签: android linkedhashset

我有一个自定义的Parcelable Object(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());
}

2 个答案:

答案 0 :(得分:0)

在您的代码中,您在循环内部调用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
}

答案 1 :(得分:0)

您的迭代方法错误。它会抛出并发修改的预期。使用迭代器时,使用迭代器中的inbuilt remove方法来删除底层集合中的项目。(iterator.remove()),iterator.next()将前进到下一个项目。 next()的每次调用都应该与hasNext()相关联。关闭申请时抛出的任何错误?

使用此示例:http://www.java-examples.com/remove-element-collection-using-java-iterator-example