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

Java 如何从数组列表中添加/删除多个对象,java,object,arraylist,Java,Object,Arraylist,我正在尝试构建一个包含对象的ArrayList。当我向列表中添加一个对象时,我希望它首先检查该对象的数组列表。如果它找到了,我希望它在这个对象中增加一个数量变量,而不是在列表中创建一个新的对象。当移除对象时,反之亦然。我已经完成了一种移除物体的方法。但是我不认为我完全理解arraylist中的方法,或者在创建和arraylist对象时的逻辑。当我使用.contains或.equals时,我没有得到想要的效果 public class ItemBag { private ArrayLi

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

    }
项目类别

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


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

.equals()方法将比较对象引用(除非.equals()被重写),以检查对象是否相同

供参考:

您可以通过以下方式重写.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;
    }

}

如果(inventory.get(i).name()==itemName){->发布
项目的代码,这应该可以工作。我的第一个猜测是,您没有实现
等于
/
hashcode
也使用映射,这样您就可以将对象与大小关联potions类当前为空,它扩展了项目。
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;
    }

}