我有一个库存类,它有一个类'Item'的数组,称为items。在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并在此行获取NPE
if (items.containsKey(item)){
Integer previousQuantity = items.get(items);
items.put(item, ++previousQuantity); // NPE this line.
} else {
items.put(item, 1);
}
答案 0 :(得分:3)
而不是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;
}
}
equals()和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;
}
}
答案 1 :(得分:0)
您可以使用Set找到唯一项目的数量。在Set中没有重复项目。因此,如果您可以将数组转换为set,那么您可以找到唯一项的数量。并且您可以通过从总项目中减去来获得重复项目的数量。 召集阵列来设置你必须做的事情
Set<Integer> uniqueItem = new HashSet<Integer>(Arrays.asList(items));
int total_repeated_item=items.length-uniqueItem.size();
答案 2 :(得分:0)
您可能需要一个唯一的ID来区分您的库存中的项目,然后您可以将其放在Map中,它可以为您计算重复项。在您的情况下,项目的名称可以是唯一标识符(这将是地图中的键)