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中删除第一个苹果或梨,因为它们也是水果吗?我希望数组列表删除任何种类的水果的第一个对象,我认为制作水果混凝土而不是抽象可能有助于此。
答案 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的元素,使得:
o
不为null,则删除第一个元素o.equals(get(i))
要删除特定元素,您需要传递此元素的位置(方法remove(int index)
),对象的引用(方法remove(Object o)
)或对象的引用,以便equals方法在比较它们时返回true。
或者,您也可以使用方法removeIf(Predicate<? super E> filter)
,如果它更符合您的请求,它将删除此集合中满足给定谓词的所有元素。