如何从数组列表中添加/删除多个对象

时间:2020-10-13 17:49:59

标签: java object arraylist

我正在尝试构建一个将包含对象的ArrayList。当我将一个对象添加到列表时,我希望它首先检查该对象的数组列表。如果找到它,我希望它增加该对象中的数量变量,而不是在列表中创建一个新对象。然后删除对象时反之亦然。我已经完成了一种删除对象时的工作方式。但是我不认为我完全了解arraylist中的方法或创建对象和arraylist对象时的逻辑。就像我使用.contains或.equals时一样,效果并不理想。

public class ItemBag {


    private ArrayList<Item> inventory = new ArrayList<Item>();


    public ItemBag() {
    }

    public void addItem(Item objName, int quantity) {
        if (inventory.contains(objName)) {
            System.out.println("if statement is true!");
            int i = inventory.indexOf(objName);
            inventory.get(i).setQuantity(inventory.get(i).getQuantity() + quantity);
        } else {
            inventory.add(objName);
            objName.setQuantity(quantity);
        }
    }

    public void removeItems(String itemName, int quantiy) {
        for (int i = 0; i < inventory.size(); i++) {
            if (inventory.get(i).name() == itemName) {
                inventory.get(i).setQuantity(inventory.get(i).getQuantity() - quantiy);
                if (inventory.get(i).getQuantity() <= 0) {
                    inventory.remove(inventory.get(i));
                }

            }
        }
    }


    public void showInventory() {
        for (int i = 0; i < inventory.size(); i++) {
            System.out.println(inventory.get(i).name() + " : " + inventory.get(i).getQuantity());
        }

    }

然后在我正在编写的另一个对象中创建itemBag时

ItemBag merchantItems = new ItemBag();

 public void merchantBob() {
        merchantItems.addItem(new HealthPotion() ,3);
        merchantItems.showInventory();
        System.out.println("add 1");
        merchantItems.addItem(new HealthPotion(),1);
        merchantItems.showInventory();

Items类

package Items;


public abstract class Item {

    private int quantity = 0;

    public Item() {
    }

    public abstract String name();

    public abstract int cost();

    public abstract String type();

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }
}

HealthPotion类


public class HealthPotion extends Potions {

    protected int addHealth = 10;


    @Override
    public int drinkPotion() {
        return addHealth;
    }


    @Override
    public String name() {
        return "Health Potion";
    }

    @Override
    public int cost() {
        return 5;
    }

    @Override
    public String type() {
        return "Potion";
    }


}

1 个答案:

答案 0 :(得分:0)

.contains()方法将遍历列表,并使用.equals()方法比较每个元素,并检查所提供的对象是否在列表中。

.equals()方法将比较对象引用(除非覆盖.equals())以检查对象是否相同。

以供参考:https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html#contains-java.lang.Object-

您可以通过以下方式覆盖.equals()方法以比较所提供对象的值:

public abstract class Item {

    private int quantity = 0;

    public Item() {
    }

    public abstract String name();

    public abstract int cost();

    public abstract String type();

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    @Override
    public boolean equals(Object object) {
        if (this == object) return true;
        if (object == null || getClass() != object.getClass()) return false;

        Item providedItem = (Item) object;
        return name == providedItem.name 
                && cost == providedItem.cost
                && type == providedItem.type;
    }

}

这应该有效