从arraylist中删除子对象

时间:2017-06-02 13:54:54

标签: java arraylist subclass

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{
}

如果我将一个Fruit对象传递给removeFood方法,它会从arraylist中删除第一个苹果或梨,因为它们也是水果吗?我希望数组列表删除任何种类的水果的第一个对象,我认为制作水果混凝土而不是抽象可能有助于此。

1 个答案:

答案 0 :(得分: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对象,而是要搜索和删除的类的名称。

注意:

ArrayList remove方法从此列表中删除指定元素的第一个匹配项(如果存在)。如果列表不包含该元素,则不会更改。更正式地,删除具有最低索引i的元素,使得:

  • 如果传递的参数为null,则删除第一个为null的元素
  • 如果传递的参数o不为null,则删除第一个元素o.equals(get(i))

要删除特定元素,您需要传递此元素的位置(方法remove(int index)),对象的引用(方法remove(Object o))或对象的引用,以便equals方法在比较它们时返回true。

或者,您也可以使用方法removeIf(Predicate<? super E> filter),如果它更符合您的请求,它将删除此集合中满足给定谓词的所有元素。