尝试在ArrayList中组合项的多个实例

时间:2016-12-14 00:03:45

标签: java arraylist methods

我正在用Java创建一个简单的基于文本的生存游戏作为我的最终项目。我仍然坚持创建库存。今天,我有点工作(正确添加和删除项目),但是当添加第三种不同类型的项目时,它覆盖了第二种。我不再拥有这个代码,而且我的老师帮助了#34;修复它#34;现在它甚至不显示库存。

主类:

public class SurvivalGame{

//inv
  static ArrayList<Item> inv = new ArrayList<Item>();
//items
  static Item Water = new Item("Water ", 1);

public static void main(String[] args){
//intro();
addItem(Water);
addItem(Water);
removeItem(Water);
showInv();
}

添加物品方法:

public static void addItem(Item item){
for(int i = 0; i < inv.size(); i++){
  if(inv.get(i).getName().equals(item.getName())){
    inv.get(i).addQuantity();
  }
break;
  }
System.out.println("Item added: 1 " + item.getName());}   

删除项目方法:

public static void removeItem(Item item){
for(int i = 0; i < inv.size(); i++){
  if((inv.get(i).getName()).equals(item.getName())){
    if((inv.get(i).getQuantity()) == 0){
      inv.remove(item);
    }
    else inv.get(i).minusQuantity();
  }
  break;
}

System.out.println("Item removed: 1 " + item.getName());}

显示库存方法:

public static void showInv(){
System.out.println("You have the following: ");
for(int i = 0; i < inv.size(); i++)
  inv.get(i).showItem();
  }
}//(end of class)

项目类别:

public class Item{

String name;
int quantity;

public Item(String n, int q){
  name = n;
  quantity = q;
}

public String getName(){
  return name;}

public void addQuantity(){
  quantity += 1;}

public void minusQuantity(){
  quantity -= 1;}

public int getQuantity(){
  return quantity;}

public void showItem(){
  System.out.println(getQuantity() + " " + getName());}

}//(end of class)

这可能是我忽视的小事,所以一些帮助会非常感激!我不能在这方面成为初学者,而且我已经尝试过多次重写。我不知道如何使用列表,所以我宁愿将库存保留为ArrayList。我考虑过让每个项目的每个实例都占用自己的&#34;库存插槽&#34;但这对我来说不够好。最后,我没有包含Player类,因为它在这里无关紧要。它没有触及库存或物品等。

系统会打印添加和删除消息,但不会打印广告资源的内容,因为它之前最多有两个项目。

1 个答案:

答案 0 :(得分:0)

我可以在addItem方法中看到两个明显的要点:

public static void addItem(Item item) {
    for (int i = 0; i < inv.size(); i++) {
        if (inv.get(i).getName().equals(item.getName())) {
            inv.get(i).addQuantity();
        }
        break;
    }
    System.out.println("Item added: 1 " + item.getName());
}

首先:break;应该在if的正文中,因为现在它会在每次第一次运行后退出循环。

第二:当您尚未在商品目录中拥有该商品时,您错过了初始添加。您只是增加了现有商品的数量。

试试这个:

public static void addItem(Item item) {
    boolean found = false;
    for (int i = 0; i < inv.size(); i++) {
        if (inv.get(i).getName().equals(item.getName())) {
            inv.get(i).addQuantity();
            // Remember that we already had the item in inventory
            found = true;
            break;
        }
    }
    if (!found) {
        // Item isn't in inventory yet: add it
        inv.add(item);
    }
    System.out.println("Item added: 1 " + item.getName());
}

请注意,您的removeItem方法看起来也很奇怪:

public static void removeItem(Item item) {
    for (int i = 0; i < inv.size(); i++) {
        if ((inv.get(i).getName()).equals(item.getName())) {
            if ((inv.get(i).getQuantity()) == 0) {
                inv.remove(item);
            }
            else inv.get(i).minusQuantity();
        }
        break;
    }
}

再次break应位于您的(第一个)if内,并且您想在任何情况下都致电minusQuantity()

在您的广告资源中考虑数量为1的商品:您的第一个条件产生false,因为getQuantity()不是0,因此您正在调用minusQuantity()并最终获得数量0的项目仍在您的库存中。

试试这个:

public static void removeItem(Item item) {
    for (int i = 0; i < inv.size(); i++) {
        if (inv.get(i).getName().equals(item.getName())) {
            // Reduce quantity
            inv.get(i).minusQuantity();
            if (inv.get(i).getQuantity() == 0) {
                // We don't have any quantity left: remove item from inventory
                inv.remove(item);
            }
            break;
        }
    }
}