2013-09-23 52 views
0

我有一个库存类,它有一个名为Item的类Item。在Item类中,我有一个名为quantity的int值来表示每次拾取获得的项目数量。我一直无法弄清楚如何获得数组中重复项的数量,这样我就可以用该项的getQuantity()方法乘以该项,并获取玩家正在携带的物品的总数量。如何识别数组中重复对象的数量

public class Inventory { 


    private Item[] items; //A private Item array, called items 
    private int firstFree; 
    private int quantity; 
    private WorldRenderer world; 


    /** 
    * CREATES THE INVENTORY AT A SIZE SPECIFIED IN THE PARATHENESIS 
    */ 
    public Inventory(int size) { 
     items = new Item[size]; 
     firstFree = 0; 
    } 


    public int getItemCount() { 
     for (int i = firstFree; i < items.length; i++) { 
      if (items[i] != null) { 
       return items.length; 
      } 
     } 
     return 0; 
    } 

    public boolean add(Item item) { 
     if (firstFree == items.length) { 
      return false; 
     } 
     items[firstFree] = item; 

     for (int i = firstFree; i < items.length; i++) 
      if (items[i] == null) { 
       firstFree = i; 
       return true; 
      } 
     firstFree = items.length; 

     return true; 


     /**for (int i = 0; i < items.length; i++) 
     if (items[i] == null){ 
     items[i] = item; 
     System.out.println("Item " + item.getName() + " added to inventory at index " + i); // TESTING 
     return true; 
     } 
     return false; 
     }**/ 
    } 

    public Item get(int index) { 
     return items[index]; 
    } 

    public void setQuantity(Item item, int quantity) { 
     for (int i = 0; i < items.length; i++) { 
      if (items[i] == item) { 
       items[i].setQuantity(quantity); 
      } 
     } 
    } 

    public void removeQuantity(Item item, int quantity) { 
     for (int i = 0; i < items.length; i++) { 
      if (items[i] == item) { 
       items[i].setQuantity(item.getQuantity() - quantity); 
      } 
     } 

    } 

    public int getQuantity(Item item) { 
     int quantity = 0; 
     for (int i = 0; i < items.length; i++) { 
      if (items[i] == item) { 
       quantity = items[i].getQuantity(); 
      } 
     } 
     return quantity; 
    } 
} 

也许有更好的方法去创建我的特定问题的清单?

编辑: 试图HashMap中并且在该行

 if (items.containsKey(item)){ 
     Integer previousQuantity = items.get(items); 
     items.put(item, ++previousQuantity); // NPE this line. 
    } else { 
     items.put(item, 1); 
    } 
+0

是否将您的代码更改为'quantity + = items [i] .getQuantity();'产生预期结果?如果不是,你目前得到的预期结果和结果是什么? –

+0

你怎么知道'Item'是否是重复的?您似乎没有任何字段(例如带有“Item”名称的字符串)可以做出该决定。 –

+0

您可能会发现先用非代码语言描述问题很有用。然后将其转换为伪代码。这样做可能会帮助您了解a所需的逻辑,并选择您的目标。同时有些想法:是什么让项目重复?你的setQuantity和removeQuantity方法正在测试它是否是相同的实例,是否正确?您的getItemCount将返回总数组大小或只有0 – Romski

回答

3

得到一个NPE不是Item[] items你可能会考虑HashMap<Item, Integer> items其中整数指的是数量。

这将确保没有重复项目以及简化查找数量。

例子:

import java.util.HashMap; 

public class Inventory { 

    private HashMap<Item, Integer> items; 
    private int maxSize; 

    public Inventory(int maxSize) { 
     this.maxSize = maxSize; 
     items = new HashMap<Item, Integer>(); 
    } 

    public int getItemCount() { 
     int count = 0; 
     for (Item item: items.keySet()){ 
      count += items.get(item); 
     } 
     return count; 
    } 

    public boolean add(Item item) { 
     if (items.size() >= maxSize){ 
      return false; 
     } 

     if (items.containsKey(item)){ 
      Integer previousQuantity = items.get(items); 
      items.put(item, ++previousQuantity); 
     } else { 
      items.put(item, 1); 
     } 

     return true; 
    } 
} 

平等的通用实现()和hashCode():

public class Item { 
    int itemType; 

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

     Item item = (Item) o; 
     if (itemType != item.itemType) { return false; } 

     return true; 
    } 

    @Override 
    public int hashCode() { 
     return itemType; 
    } 
} 
+0

这假定你的Item类散列了一个函数'equals()'方法。 –

+0

感谢您的信息,我认为我想尝试一下,似乎会简化一些事情。但是你的意思是我的Item类有一个功能equals()方法。我在GameObject中有一个名为Type的int(Item extends GO),所以我可以创建Item'types',这会工作吗? – AspiretoCode

+0

HashMap上的[get method](http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html#get%28java.lang.Object%29)使用[equals() ](http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals%28java.lang.Object%29)来检索项目。您还需要重写'hashCode()'方法。您可能需要阅读java hashcode和equals方法。 –

0

您可以通过使用组找出独特的项目数。在Set中,不重复项目。所以如果你可以转换你的数组来设置,那么你可以找到唯一项目的数量。你可以通过从总项目中减去重复项目的数量。 到convet数组来设置你所要做的

Set<Integer> uniqueItem = new HashSet<Integer>(Arrays.asList(items)); 
int total_repeated_item=items.length-uniqueItem.size(); 
0

你可能需要一个唯一的ID在你的库存项目进行区分,然后你可以把在一个地图,可以只照顾计数重复的为您服务。在你的情况下,该项目的名称可以是唯一的标识符(这将是地图中的关键) 。