这里是我的代码:
int ii = 0;
HTMLOption[] options = new HTMLOption[zoneList.size()];
for (AuditPlanSch zone : zoneList) {
System.out.println("Before Temp====" + tmp.getZoneCode() + "---list-" + zone.getZoneCode() + "----iii" + ii);
if (tmp.getZoneCode().equals(zone.getZoneCode())) {
System.out.println("Temp==2==" + tmp.getZoneCode() + "---list-2-" + zone.getZoneCode());
zoneList.remove(zone.getZoneCode());
}
System.out.println("After Temp====" + tmp.getZoneCode() + "---list--" + zone.getZoneCode() + "----iii" + ii);
options[ii++] = new HTMLOption(zone.getZoneCode(), zone.getZoneName(), false);
}
输出:
Before Temp====14751---list--14751----iii1
Temp==2==14751---list-2-14751
After Temp====14751---list--14751----iii1
Before Temp====14751---list--14752----iii2
After Temp====14751---list--14752----iii2
Before Temp====14751---list--14754----iii3
After Temp====14751---list--14754----iii3
Before Temp====14751---list--14756----iii4
After Temp====14751---list--14756----iii4
Before Temp====14751---list--15844----iii5
After Temp====14751---list--15844----iii5
Before Temp====14751---list--M6205----iii6
After Temp====14751---list--M6205----iii6
等值不从列表中删除。
答案 0 :(得分:1)
您的zoneList
是AuditPlanSch
的列表,但是您在zoneList.remove(zone.getZoneCode());
上试图删除代码(我认为是整数或字符串)。
一个变化是:zoneList.remove(zone.getZoneCode());
应该是zoneList.remove(zone);
。
但是,这将提供ConcurrentModificationException,因为您正尝试从要进行遍历的列表中删除项目。因此,改为将其更改为:
for(Iterator<AuditPlanSch> it = zoneList.iterator(); it.hasNext(); ) {
AuditPlanSch zone = it.next();
if (tmp.getZoneCode().equals(zone.getZoneCode())) {
it.remove();
}
options[ii++] = new HTMLOption(zone.getZoneCode(), zone.getZoneName(), false);
}
编辑:此外,您的打印行意义不大,因为即使将其从列表中删除,您仍然可以访问变量中的zone
和tmp
。
要查看是否已按预期从列表中删除值,请尝试打印整个列表。
此外,我怀疑您要在删除后将null
添加到HTMLOption
,所以我也将其添加到了代码中:
for(Iterator<AuditPlanSch> it = zoneList.iterator(); it.hasNext(); ) {
System.out.println("List before: "+zoneList);
AuditPlanSch zone = it.next();
String zoneCode = zone.getZoneCode();
String zoneName = zone.getZoneName();
if (tmp.getZoneCode().equals(zone.getZoneCode())) {
System.out.println("Remove zone with code "+zone.getZoneCode());
it.remove();
zoneCode = null;
zoneName = null;
}
System.out.println("List after: "+zoneList);
options[ii++] = new HTMLOption(zoneCode, zoneName, false);
}
答案 1 :(得分:0)
首先,您没有使用正确的实例类型来为此列表删除。
从列表中删除第一次出现的指定元素(如果存在)(可选操作)。如果此列表不包含该元素,则它保持不变。更正式地讲,删除索引i最低的元素,使(o == null?get(i)== null:o.equals(get(i)))(如果存在这样的元素) )。如果此列表包含指定的元素(或等效,如果此列表由于调用而更改),则返回true。
因此,您需要传递一个可以与列表中的实例进行比较的实例:
zoneList.remove(zone);
第二,AuditPlanSch
必须实现equals(Object)
方法。 List.remove(Object)
需要此来找到要删除的实例。 (如文档所述)
最后,您需要使用迭代器来更新将要迭代的列表(或通过索引,但迭代器更简单),否则您将获得并发修改异常。
当然,您可以使用Collection.removeif
方法以更简单的方式进行操作:
final tmp ...
list.removeIf(zone -> tmp.getZoneCode().equals(zone.getZoneCode()))
这将简单地删除zone
为真的每个实例tmp.getZoneCode().equals(zone.getZoneCode())
。请注意,tmp
必须是最终的(或实际上是最终的)才能编译此lambda表达式。
这样做的好处是您不必使实例正确实现equals
,只需定义要使用的条件即可。