2

我正在和一个朋友一起做一个电子游戏。为了考虑不同类型的项目,我们最初为每个项目都有一个类,扩展了一个项目类。这些类中没有太多数据,所以我一直在寻找替代方案,这样我们的工作空间就不会那么混乱。我开始学习 HashMaps,我认为它们是一种很棒的添加项目的方式。我们还可以对其进行设置,这样我们就可以使用字符串访问它们,而不是使用 int 访问 HashMap 中的项目,这基本上只是使其成为一个 ArrayList。所以我开始添加这个功能,在 Item 类中创建匿名 Items,

    private static Item coal = new Item() {
        weight = .2;
        setImageID(0, 16);
    }

并将它们添加到 HashMap。

    itemMap.put("Coal", coal);

在做了一些这些之后,我意识到列表中每种类型只有一个项目,如果我们想要有多个可以在不修改原始项目的情况下修改的项目,我们需要制作副本。我开始研究如何做到这一点。我们可以使用复制构造函数,但是 Item 中的变量太多,无法有效地完成。我们当然可以这样做,但我想知道是否有一个简单的解决方案。我们能把所有的项目都做成最终的吗?我只是吐口水,因为我对这个编程领域完全陌生。我们也可能做错了这件事。我只需要一种方法来使用 HashMap 来创建一些“项目数据库”,我可以使用它来访问列表中无限数量的项目。有什么建议么?

4

4 回答 4

5

如何拥有一个具有集合值的 HashMap(或一个列表,取决于同一个项目是否可以多次存在)?

Map<String, Set<Item>> map = new HashMap<String, Set<Item>>();

这样,您可以为每种类型拥有多个项目。

将新项目添加到类型集合的一个习惯用法如下:

Set<Item> items = map.get(type);
if (items == null) {
     items = new HashSet<Item>();
     items.put(type, items); 
}
items.add(item);

Enum为您的类型使用 an 而不仅仅是一个 String甚至可能不是一个坏主意。然后你可以做这样的事情,map.put(Item.COAL, itemSet);这将有助于防止拼写错误和区分大小写的问题。

于 2012-03-08T16:56:20.800 回答
0

Hashmap<string,ArrayList<Item>>也许工作?然后itemMap.put("Coal", coal),您必须确保 itemMap.get("Coal") 已经有一个数组列表,而不是 ,并将新项目附加到列表中。

于 2012-03-08T16:56:49.587 回答
0

您是否知道您可以使用以下语句指定您的地图:

HashMap<Integer, Item[]> map = new HashMap<Integer, Item[]>();

或者

HashMap<String, Item[]> map = new HashMap<String, Item[]>();

将每个项目集/数组/列表与整数或字符串相关联可能会解决您的问题。

于 2012-03-08T16:59:56.447 回答
0

如果我正确理解这一点,您应该拥有每个 HashMap 中所有项目的列表,以访问项目类型下的多个项目。为此,只需制作一个HashMap<String, ArrayList<Item>>. 当您第一次创建一个项目类型时,创建一个新的ArrayList<Item>并在添加相同项目类型的后续项目时,只需附加到列表中。

但是,HashMap 对此并没有那么有效。如果你有一个已知数量的项目类型,我会让ArrayList<ArrayList<Item>>你初始化外部 ArrayList 的 initialCapacity 等于你拥有的项目类型的数量,并且有一个方法可以将项目类型的名称转换为索引由于缺少负载因子,它存储在外部 ArrayList 中以提高内存效率并绕过散列函数的开销。将项目名称转换为索引的方法的替代方法是可能为每个项目类型添加一个项目类型 ID。

所以你会有:

class Coal {
    public int id = 0
}

假设您的外部 ArrayList 被命名itemTypes并且您的项目是coal,添加将只是:

itemTypes.get(coal.id).add(coal)

您对要使用哪个实现的调用,HashMap 编写的代码更简单,编写的代码更少,但性能更低,内存使用增加。

于 2012-03-08T17:00:26.543 回答