【问题标题】:how to add/remove multiples of objects from an array list如何从数组列表中添加/删除多个对象
【发布时间】:2025-11-27 22:15:01
【问题描述】:

我正在尝试构建一个包含对象的 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();

物品类

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

健康药水类


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";
    }


}

【问题讨论】:

  • if (inventory.get(i).name() == itemName) { -> How do I compare strings in Java?
  • 发布Item的代码。我的第一个猜测是你没有实现equals/hashcode
  • 还可以使用地图,以便将对象与大小相关联
  • 魔药类目前是空的,它扩展了Item。

标签: java object arraylist


【解决方案1】:

.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;
    }

}

这应该可以工作

【讨论】: