2013-10-31 132 views
1

我想比較天氣項目是否包含在arrayList中,如果它然後將其刪除。林不知道天氣我必須實現我自己的等於方法或不,這是我的代碼,但它不工作,以刪除正確的項目。從arraylist java中刪除項目

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; 
} 
+1

查看'ArrayList'的'contains'和'remove'方法。 –

+3

最好在迭代器上使用迭代器和remove()以避免併發修改異常。 – kosa

+1

是的,你必須爲你的'Item'類實現equals和hashCode – RamonBoza

回答

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 
} 
+0

這將永遠返回false! 'romove'不是arraylist的函數 –

+0

你在刪除時有一個錯字 –

+1

這遍歷了兩次列表 - 一次爲'contains()',另一次爲'remove()'。如果該項不在列表中,您可能只需調用remove()並讓它失敗。 – Kenster

2

可以使用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; 
} 

安全移除從Collection項目你也可以只叫

items.remove(item); 
2

ArrayList#remove(Object)將恰恰如此!但是,只有在覆蓋Itemequals方法時,這纔有效。 如果你想刪除所有的元素,將需要一個循環:

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。

+0

請注意,此循環將在刪除每個項目後查找從開始*刪除*的元素。它有一個複雜的'O(k * n)',其中'k'是'list.size()','n'是數字'item'貨幣。這可以通過''O(k)''使用list.iterator()'和'iterator.remove()'完成。 – rzymek

0

是的,你必須在你的類中覆蓋equals。比較每一個屬性,當其中一個不等於另一個時,然後返回false。例如,如果你使用eclipse,你可以讓它爲你的類創建equals方法。