我正在尝试构建一个将包含对象的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";
}
}
答案 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;
}
}
这应该有效