【问题标题】:How to remove objects from arraylist during iteration?如何在迭代期间从数组列表中删除对象?
【发布时间】:2017-06-02 14:56:47
【问题描述】:

我正在 Android Studio 中构建一个应用,其中包含各种树木和灌木首选项以及复选框。您选中一个框,表示您想要一棵具有某种特征的树,代码运行在清单中所有树木和灌木的数组列表中(我创建了一个植物类,具有大小、名称、水果等属性)和将符合该条件的对象的所有字符串名称添加到另一个要在不同屏幕上打印的字符串数组列表(称为“选择”)(在另一个步骤中打印之前消除重复项)。

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

    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' 的数组列表,以挑选出与复选框相对应的植物(在这种情况下,这三个块将挑选出小型、中型和大型植物 - s、m、 l) 并将它们添加到稍后要打印的另一个字符串数组列表中。它还会从第一个数组列表 test 中删除植物,以便在选中其他复选框时无法比较它们(这将导致最终的植物列表不符合使用复选框选中的所有标准)。

Java 不喜欢我尝试从数组列表“测试”中删除元素的方式,因为这就是我正在迭代的内容。如果对象不符合标准,那么在迭代期间删除对象的正确方法是什么?我听说我应该使用实际集合的迭代器?我将如何处理这段代码?

谢谢!

【问题讨论】:

标签: java android android-studio arraylist iterator


【解决方案1】:

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

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

改为

p.getSize() == "s"

【讨论】:

    【解决方案2】:

    如果您想在迭代列表时从列表中删除项目,您应该为此使用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 将检查字符串中的相同内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      • 2019-02-12
      • 2017-02-10
      • 2012-04-01
      • 1970-01-01
      • 2013-01-29
      相关资源
      最近更新 更多