【问题标题】:Refactoring a class using ArrayList to use HashMap (Java)使用 ArrayList 重构类以使用 HashMap (Java)
【发布时间】:2011-04-26 17:48:29
【问题描述】:

有人告诉我将所有内容都更改为 HashMap() 而不是 ArrayList(),并且在大多数情况下,一切都很完美。但是,我无法让这种方法正常工作。

我的 HashMap() 看起来像

私有 HashMap critMap = new HashMap();

我有房间类和生物类房间可以有生物。 Creatures 需要能够对我已经有方法的某些命令做出反应,并且只要这种方法是正确的,它们就应该可以工作。我不确定出了什么问题。

这是ArrayList()的方法

public void critReactRoomStateChange2(String command, PC pc, String name) {
    Creature temp = null;
    for (int i = 0; i < critArr.size(); i++) {
        if (!(getCreatures().get(i) instanceof PC) && !(getCreatures().get(i).getName().equals(name))) {
            temp = getCreatures().get(i);
            if (temp != null) {
                getCreatures().get(i).reactStateChange(command, pc);
                temp.checkNewRoom();
                if (!temp.equals(getCreatures().get(i))) {
                    i--;
                }
            }
        }
    }
}

这是我累了实现HashMap()之后的方法

public void critReactRoomStateChange(String command, PC pc, String name) {
    Creature temp = null;
    if (!(getCreatures().get(name) instanceof PC)) {
        temp = getCreatures().get(name);
        if (temp != null) {
            getCreatures().get(name).reactStateChange(command, pc);
            temp.checkNewRoom();
        }
    }
}

getCreatures().get(name) 将传递给它的字符串名称作为 hashMap 的键来查找它所指的实际对象。如上所述,我的 hashMap 因此生物名称是字符串(键),值 Creature(包含名称以外的其他信息)是值。当我调用 getCreature().get(name) 时,我正在寻找密钥字符串名称,我希望它返回对象 Creature。如果它在 hashMap 中找不到它应该返回 null ,除非我弄错了。

我可能只是错过了一些非常简单的东西。任何帮助将不胜感激。如果需要更多代码,我很乐意编辑并将其放入。
谢谢

编辑:生物类是抽象的,PC、动物、NPC 都对其进行了扩展。只是这样你就不会想知道随机的 PC 和 NPC 和动物在做什么。哈哈

Edit2:没有错误,除了我没有得到反应。它什么也不做,所以 critReactRoomStateChange 现在不起作用。生物没有被传递,因此其他方法可以对其进行操作。

所以第二个代码框不能正常工作。它本质上什么都不做。

【问题讨论】:

  • 什么方法不能正常工作?你有什么错误吗?
  • 与其添加代码,不如详细说明原始方法的意图是什么。为什么每一行都做它该做的事?
  • 没有错误,除了我没有得到反应。它什么也不做,所以 critReactRoomStateChange 现在不起作用。生物不会被传递,因此其他方法可以对其进行操作。
  • 我还想指出您在标题中选择的措辞相当糟糕。 “实现 HashMap”通常意味着您正在编写自己的 HashMap 版本,而您所做的更多的是“使用 ArrayList 重构类以使用 HashMap”。
  • 好的,我很抱歉。给我一点时间,我会拿出代码并为我的问题添加更好的定义。

标签: java hashmap


【解决方案1】:

我看到,当您使用 ArrayList 时,您应用了 getCreatures().get(i) 方法。可能是您切换到 HashMap 后没有更改 getCreatures() 方法,因为更改后您不需要循环和 get(i)。

【讨论】:

  • 我认为这个问题归结为循环,它只是选择地图中的第一件事或 Sting 名称值。我认为我需要做的是创建一个循环遍历整个 hashMap 的迭代器,并询问该映射中的每个 Creature 是否应该对更改做出反应。我认为我从原始方法到新方法感到困惑的地方是我不能使用 for 循环,我只是认为它应该可以工作,因为您可以使用 hashMap 从字符串值中查找名称。长话短说,字符串名称不应该是我检查的唯一内容。谢谢大家的帮助
  • 是的。我以为那是你的问题。但是您的朋友建议您精确地使用哈希图,这样您就不必循环遍历它。我相信您应该能够轻松地修改您的 getCreatures 方法,这样字符串名称键将是您获取 Creature 对象的唯一必要输入。在这种情况下,更少的循环 = 更好。
猜你喜欢
  • 2012-03-10
  • 2011-01-01
  • 1970-01-01
  • 2015-02-13
  • 2013-12-10
  • 2010-10-02
  • 2012-01-01
  • 2014-05-28
  • 1970-01-01
相关资源
最近更新 更多