如何从列表中删除值

时间:2018-08-28 09:58:18

标签: java servlet-3.0

  

这里是我的代码:

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
  

等值不从列表中删除。

2 个答案:

答案 0 :(得分:1)

您的zoneListAuditPlanSch的列表,但是您在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);
}

编辑:此外,您的打印行意义不大,因为即使将其从列表中删除,您仍然可以访问变量中的zonetmp

要查看是否已按预期从列表中删除值,请尝试打印整个列表。

此外,我怀疑您要在删除后将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)

首先,您没有使用正确的实例类型来为此列表删除。

List.remove(Object)

  

从列表中删除第一次出现的指定元素(如果存在)(可选操作)。如果此列表不包含该元素,则它保持不变。更正式地讲,删除索引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,只需定义要使用的条件即可。