当数据类型为抽象时,如何从ArrayList中删除项目?

时间:2018-09-21 01:39:25

标签: java oop arraylist abstract-class

我是Java的新手,因此,如果这个问题太愚蠢或其他什么,我首先对不起。我有一个抽象类的ArrayList。我在列表中添加了一些对象。现在,我需要通过其属性之一找到它来删除其中之一。问题是抽象类有两个具体的类,并且它们都已添加到列表中。该属性是从抽象类继承的,因此当我进行一次foreach时,我会使用抽象类对其进行处理,但是我不知道如何告诉它需要删除的对象是这个具体的类,而不是另一个。 / p>

    public void removeFruit (Integer fruitCode) {
Apple lostFruit = null;
Banana lostFruit2 =null;
    for (Fruit fruit1 : fruitList) {
        if (fruit1.getFruitCode().equals(fruitCode) && fruit1 == Apple) {
            lostFruit = (Apple) fruit1;
            fruitList.remove(lostFruit);
        }else {
            lostFruit2 = (Banana) fruit1;
            fruitList.remove(lostFruit2);
        }

    }
    System.out.println(fruitCode + "has been removed from the list");

}

3 个答案:

答案 0 :(得分:2)

您需要一个Iterator来完成此操作(for-each循环隐藏)。正如Iterator.remove() Javadoc指出的那样,如果在迭代进行过程中以其他方式(而不是调用此方法)修改了基础集合,则未指定迭代器的行为。

Iterator<Fruit> iter = fruitList.iterator();
while (iter.hasNext()) {
    Fruit f = iter.next();
    if (f.getFruitCode().equals(fruitCode)) {
        if (f instanceof Apple) {
            Apple a = (Apple) f;
            // ...
        } else if (f instanceof Banana) {
            Banana b = (Banana) f;
            // ...
        }
        iter.remove();
        System.out.println(fruitCode + " has been removed from the list");
    }
}

答案 1 :(得分:2)

无需投射

  

该属性是从抽象类继承的

无需投射。处理Fruit时,我们不在乎AppleBanana

如果抽象类具有所需的内容,则无需关心具体的子类。这就是polymorphism的意义,当更通用的类型足够时,不在乎特定类型。

public Fruit removeFruit (Integer fruitCode , List<Fruit> fruitList ) {

    for (Fruit fruit : fruitList ) {
        if ( fruit.getFruitCode().equals( fruitCode ) {
            fruitList.remove( fruit );
            return fruit ;
        }
    }
    return null ;  // In case you fruit code was not found.
}

用法示例:

List<Fruit> fruits = … ;
Integer fruitCode = … ;
Fruit fruitRemoved = this.removeFruit( fruitCode , fruits ) ;
System.out.println(
    "You deleted fruit code: " + fruitCode + " of type: " + fruitRemoved.getClass().getName() ;
)
  

您删除了水果代码:42,类型为:Apple


在上面的示例中,我实际上将返回Optional<Fruit>而不是Fruit。但这是另一回事。

答案 2 :(得分:-1)

检查fruit1是否为Apple类的实例

if (fruit1 instanceof Apple) {
// your code
}