如何识别数组中重复对象的数量

时间:2013-09-23 17:02:44

标签: java arrays

我有一个库存类,它有一个类'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);
    }

3 个答案:

答案 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中,它可以为您计算重复项。在您的情况下,项目的名称可以是唯一标识符(这将是地图中的键)