1

我正在尝试比较 arrayList 中包含的项目的天气,如果是则将其删除。我不确定天气我是否必须实现自己的 equals 方法,这是我的代码,但它无法删除正确的项目。

  public boolean removeItem(Item item) {

    for(int i = 0; i < items.size(); i++) {

        if (items.get(i).equals(item)) {
            items.remove(item);
            return true;
        } 


    }
    return false;
}
4

4 回答 4

2

您可以安全地从Collection使用中删除项目Iterator

public boolean removeItem(Item item) {    
  Iterator<Item> it = items.iterator();
  while (it.hasNext()) {
     Item i = it.next();
     if(i.equals(item)) {
       it.remove();
       // remove next line if you want to remove all occurrences `item`
       return true; 
     }      
  }
  return false;
}

你也可以打电话

items.remove(item);
于 2013-10-31T13:57:26.237 回答
2

ArrayList#remove(Object)将做到这一点!但这仅在您覆盖equalsItem. 如果要删除所有元素,则需要一个循环:

public int remove(Item item) {
    int i = 0;

    while(list.remove(item)) {
        i++;
    }

    return i;
}

这将返回已删除的项目数量

从此列表中删除第一次出现的指定元素(如果存在)。如果列表不包含该元素,则它不变。更正式地说,删除具有最低索引 i 的元素,使得 (o==null ? get(i)==null : o.equals(get(i))) (如果存在这样的元素)。如果此列表包含指定的元素(或等效地,如果此列表因调用而更改),则返回 true。

于 2013-10-31T13:57:42.530 回答
0

我认为你想要包含不等于`。你甚至不需要循环它。这就是方法的魔力。

public boolean removeItem(Item item) {

    if (items.contains(item)){
        items.remove(item);
    }
    return false;  // I have no idea why you want to return false.
                   // I'll just leave it there
}
于 2013-10-31T13:56:01.050 回答
0

是的,你必须在你的类中重写equals。比较每个属性,当其中一个不等于另一个时,然后返回false。例如,如果你使用 eclipse,你可以让它为你的类创建 equals 方法。

于 2013-10-31T14:00:41.600 回答