我正在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'中删除元素的方式,因为这是我正在迭代的内容。如果不符合标准,在迭代期间删除对象的正确方法是什么?我听说我应该使用实际集合的迭代器?我将如何为此代码执行此操作?
谢谢!
答案 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
检查字符串中的相同内容时检查对象是否是同一个实例。