如何在迭代期间从arraylist中删除对象?

时间:2017-06-02 14:56:47

标签: java android android-studio arraylist iterator

我正在Android Studio中构建一个应用程序,其中包含各种树和灌木首选项以及复选框。你检查一个框,表明你想要一个具有特定特征的树,代码通过清单中所有树木和灌木的arraylist运行(我创建了一个Plant类,其中包含大小,名称,水果等属性)和将与该条件匹配的对象的所有String名称添加到另一个要打印的字符串的arraylist(在另一个屏幕上调用' selections')(在另一个步骤中打印之前删除重复项)。

问题在于在迭代期间从arraylist中删除对象。这是一个示例:

    if (cb_s.isChecked()) {
        for(Plant p : test){
            if(p.getSize() == "s"){
                selection.add(p.getName());
            }
            else{
                selection.remove(p.getName());
                test.remove(p);
            }
        }
    }
    if (cb_m.isChecked()) {
        for(Plant p : test){
            if(p.getSize() == "m"){
                selection.add(p.getName());
            }
            else{
                selection.remove(p.getName());
                test.remove(p);
            }
        }
    }
    if (cb_l.isChecked()) {
        for(Plant p : test){
            if(p.getSize() == "l"){
                selection.add(p.getName());
            }
            else{
                selection.remove(p.getName());
                test.remove(p);
            }
        }
    }    

对于选中的每个复选框,它会通过名为' test'的arraylist运行。挑选出与复选框相对应的植物(在这种情况下,这三个块将挑选出小型,中型和大型植物 - s,m和l)并将它们添加到另一个字符串中,以便稍后打印。它还会从第一个arraylist中删除植物,测试,以便在检查其他复选框时无法比较它们(这将导致植物的最终列表不符合通过复选框选择的所有标准)。

Java不喜欢我试图从arraylist' test'中删除元素的方式,因为这是我正在迭代的内容。如果不符合标准,在迭代期间删除对象的正确方法是什么?我听说我应该使用实际集合的迭代器?我将如何为此代码执行此操作?

谢谢!

2 个答案:

答案 0 :(得分:1)

不要将String与==方法进行比较,而是在所有情况下使用.equals进行比较,例如

p.getSize().equals("s")

代替

p.getSize() == "s"

答案 1 :(得分:0)

如果要在迭代列表时从列表中删除项目,则应使用iterator

Iterator<Plant> iterator = test.iterator();
while (iterator.hasNext()) {
    p = iterator.next();
    if(p.getSize().equals("l")){
        selection.add(p.getName());
    } else {
        selection.remove(p.getName());
        iterator.remove();
    }
}

此外,您应该将String与equals方法进行比较。 ==将在equals检查字符串中的相同内容时检查对象是否是同一个实例。