2017-06-02 18 views
0
public class FoodStorage{ 
    ArrayList<Food> foodList = new ArrayList<Food>(); 

    FoodStorage (ArrayList<Food> foodToStore){ 
    foodList.addAll(foodToStore); 
    } 

    public void removeFood(Food food){ 
    foodList.remove(food); 
    } 
} 

public abstract class Food{ 
    boolean rotten; 
    int daysOld; 

    abstract void spoil(); 
} 

public class Meat extends Food(){ 
} 

public class Fruit extends Food{ 
} 

public class Apple extends Fruit{ 
} 

public class Pear extends Fruit{ 
} 

如果我將一個水果對象傳遞給removeFood方法,它會從數組列表中刪除第一個蘋果或梨,因爲它們也是水果或不是?我想要數組列表刪除第一個是任何類型水果的對象,我認爲使水果具體而不是抽象可能有助於解決這個問題。從數組列表中刪除子對象

+0

您是否嘗試過運行代碼來檢查? – airos

+0

是的,它不會刪除子類水果infact創建一個新的對象,你想刪除和調用列表的remove(Object)方法什麼也不做。 – Macmanmatty

回答

0

不,它會搜索您正在傳遞的實際對象並將其移除(*)。它不搜索並刪除相同類別或子類別的對象

如果您傳遞的對象與ArrayList中包含的任何對象不匹配,則它不會刪除任何內容。相反,如果傳遞的對象實際上存儲在ArrayList中,它將被刪除(例如下面的代碼將刪除Apple對象)。

ArrayList<Food> fl = new ArrayList<Food>(); 

    Meat m = new Meat(); 
    fl.add(m); 
    Fruit f=new Fruit(); 
    fl.add(f); 
    Apple a=new Apple(); 
    fl.add(a); 
    Pear p=new Pear(); 
    fl.add(p); 

    Fruit fruit = a; 

    FoodStorage fs = new FoodStorage(fl); 
    fs.removeFood(fruit); 

如果你想刪除第一個對象,它是一個給定的類的實例,那麼你需要執行的代碼,遍歷該ArrayList,直到找到這樣的對象。在這種情況下,我認爲該方法不應該收到Food對象,而是要搜索和刪除的類的名稱。

注:

ArrayListremove方法刪除指定元素第一次出現在此列表中,如果它是存在的。如果該列表不包含該元素,則不變。更正式地,去除具有最低索引i,使得所述元件:

  • 如果傳遞的參數爲空,則刪除該爲空
  • 如果傳遞的參數o不爲空,則去除所述第一元件第一元件,使得o.equals(get(i))

要刪除一個特定的元素,需要傳遞這樣的元素(方法remove(int index)),該對象(方法remove(Object o))或到對象,使得基準的基準的任意的位置其com時,equals方法返回true削減他們。

或者,您也可以使用方法removeIf(Predicate<? super E> filter),該方法將刪除此集合中滿足給定謂詞的所有元素(如果它更符合您的請求)。

+0

so我將如何刪除第一個與我想從對象的數組列表中刪除的對象相同的類的對象?運行for循環並檢查instanceof,然後通過索引刪除匹配的元素是唯一的方法? – Macmanmatty

+0

是的,你需要找到一個對象,它是被搜索類的一個實例。我編輯了我的答案以包含此內容。在那種情況下,我不認爲這個方法應該接收一個具體的對象作爲參數,它不應該只接收類的名字嗎? – airos

+0

這僅僅是一個簡單的例子,在我正在研究的每個項目/食物中都會有各種其他屬性,例如體重,毒素等等,每個人都會攜帶各種物品的武器,藥水,食物黃金等的陣列列表所以該項目將需要。但如果我做了arrayList.add(new Object());在數組列表中如何識別該對象?你會把什麼Arraylist.remove()方法刪除它?或者只能通過索引刪除該對象? – Macmanmatty