Java 如何识别阵列中重复对象的数量

Java 如何识别阵列中重复对象的数量,java,arrays,Java,Arrays,我有一个inventory类,它有一个名为items的类“Item”数组。在Item类中,我有一个名为quantity的int来表示每次拾取时获得的项目数量。我还没有弄清楚如何获得数组中重复项目的数量,因此我可以将其乘以该项目的getQuantity()方法,并获得玩家携带的项目的总数量 public class Inventory { private Item[] items; //A private Item array, called items private i

我有一个inventory类,它有一个名为items的类“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;
    }
}

而不是<代码>项[]代码< /C> >您可以考虑“代码> HASMAP项< /代码>,其中整数指的是数量。

这将确保没有重复的项目,并简化查找数量

示例:

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;
    }
}
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;
    }
}

而不是<代码>项[]代码< /C> >您可以考虑“代码> HASMAP项< /代码>,其中整数指的是数量。

这将确保没有重复的项目,并简化查找数量

示例:

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;
    }
}
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;
    }
}

您可以使用Set查找唯一项目的编号。在集合中,没有重复的项目。因此,如果可以将数组转换为set,则可以找到唯一项的数量。你可以从总项目中减去重复项目的数量。 要转换数组以进行设置,必须执行以下操作

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

您可以使用Set查找唯一项目的编号。在集合中,没有重复的项目。因此,如果可以将数组转换为set,则可以找到唯一项的数量。你可以从总项目中减去重复项目的数量。 要转换数组以进行设置,必须执行以下操作

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

您可能需要一个唯一的ID来区分库存中的项目,然后您可以将其放入地图中,这样就可以为您计算重复项。在您的情况下,项目的名称可以是唯一标识符(这将是映射中的键)
.

您可能需要一个唯一的ID来区分库存中的项目,然后您可以将其放入一个地图中,该地图可以为您计算重复项。在您的情况下,项目的名称可以是唯一标识符(这将是映射中的键)

.

是否将代码更改为
quantity+=items[i].getQuantity()生成预期结果?如果不是,预期的结果是什么?您当前得到的结果是什么?您如何知道
是否重复?您似乎没有任何字段(例如带有
名称的字符串)可以做出该决定。您可能会发现,先用非代码的形式表述问题很有用。然后将其转换为伪代码。这样做可能有助于您理解选择目标所需的逻辑。与此同时,一些想法:是什么让一件物品成为复制品?您的setQuantity和removeQuantity方法正在测试它是否是同一个实例,是否正确?您的getItemCount将返回总数组大小或0 OnlyTanks,对于快速响应人员,我现在无法进入Eclipse,在工作中:(.@music_coder我在我的GameObject类中有一个字符串“name”,这是我的Item类扩展的。我试图使用.equalSigningCase来查找数量,但我可能做错了。@Tanis.7x也会尝试,而你太过轻率了,无法将代码更改为
quantity+=items[I].getQuantity()
产生预期结果?如果没有,预期结果是什么?您当前得到的结果是什么?如何知道
是否重复?您似乎没有任何字段(例如带有
名称的字符串)这可能会做出决定。你可能会发现先用非代码表达问题很有用。然后将其转换为伪代码。这样做可能会帮助你理解选择目标所需的逻辑。与此同时,一些想法:是什么让项目重复?你的setQuantity和removeQuantity方法正在测试它是否是same实例,对吗?您的getItemCount将返回总数组大小或0 OnlyTanks,对于快速响应人员,我现在无法进入Eclipse,在工作中:(.@music_coder我在我的GameObject类中有一个字符串“name”,这是我的Item类扩展的。我尝试使用.equalSigningCase来查找数量,但我可能做错了。@Tanis.7x也会尝试,你太罗姆斯基了。这假设你的Item类散列了一个函数
equals()
method。谢谢你提供的信息,我想我想试试这个,看起来它会简化很多事情。但是你说我的Item类有一个函数equals()方法是什么意思呢?我在GameObject(Item)中有一个名为Type的int,这样我就可以创建项“类型”,行吗?on HashMap用于检索项。您还需要重写
hashCode()
method。您可能想了解java hashcode和equals方法。@AspiretoCode基本上,如果您不重写equals方法,您的项目列表中可能会出现重复的项目。当我阅读您的问题@AspiretoCode时,我一直在思考HashMap。我很高兴有其他人建议,这是正确的方法是。它还将使项目查找更加直接和快速。这假设您的项目类散列了一个函数式的
equals()
方法。感谢您提供的信息,我想我想尝试一下,这似乎会简化很多事情。但是,您认为我的项目类具有函数式equals()是什么意思方法。我在GameObject(Item extends GO)中有一个名为Type的int,因此我可以创建Item“types”,这样行吗?on HashMap用于检索项目。您还需要覆盖
hashCode()