从数组列表中删除子对象

问题描述:

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

不,它会搜索您正在传递的实际对象并将其移除(*)。它不搜索并删除相同类别或子类别的对象

如果您传递的对象与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