使用 For Each 遍历 HashMap

3

我希望能够通过类似于 for each 循环的方式遍历“character”哈希表并获取所有“Stat”对象。例如,我想创建一个名为“showStats”的函数。为此,我希望能够输出包含在“character”哈希表中的所有“stat”对象。有人知道如何做到这一点吗?

HashMap<String, GameObject> character = new HashMap<String, GameObject>;
character.put("Health", new Stat("Health",10));
character.put("Accuracy", new Stat("Accuracy",10));
character.put("Strength", new Stat("Strength",10));
character.put("Coins",new Item("Coins","Your Money"));
character.put("Head",new BodyPart("Head"));
3个回答

4

使用 values 集合

for(GameObject gameObject : character.values()) { 
    if(gameObject instanceof Stat) { }
}

那么我是否应尝试将gameObject强制转换为以下内容?Stat myStat; for(GameObject gameObject : character.values()) { if(gameObject instanceof Stat) { myStat = gameObject System.out.println(myStat); } } - CodeManiak
@CodeManiak 你可以使用 if(gameObject instanceof Stat) { mystat = (Stat)gameObject; } - Zim-Zam O'Pootertoot
但是最好不要在地图中混合使用不同类型的游戏对象。你的地图中是否有包含不同类型的游戏对象的充分理由? - jahroy
@jahroy 我认为这取决于他如何使用地图。如果他99%的时间只关心GameObjects,那么我更喜欢使用instanceof迭代器来获取1%的时间,而不是维护一个单独的Stat地图。如果他需要更频繁地获取Stats,那么单独的Stat数据结构将更可取。 - Zim-Zam O'Pootertoot
是的,你说得对。话虽如此,我的评论更多地是为了引导初学者在一般情况下朝正确的方向前进。一旦你理解了自己在做什么,权衡这两种方法的取舍就变得非常合理了。 - jahroy
最初,我为所有不同的游戏对象(如统计数据、武器、盔甲、任务、物品等)分别使用了独立的ArrayList和数组。但是,我决定将它们全部转换成HashMaps,这样我就可以使用单个“Get”函数和字符串键来获取特定角色或物品拥有的每个游戏对象。不确定这是否是良好的惯例,但它确实节省了大量代码行 :) - CodeManiak

1
您可以使用Map接口的values()方法仅迭代值,或者您也可以使用entrySet()方法来迭代每个Map条目:
for (Map.Entry<String, GameObject> entry : character.entrySet()) {
    String key = entry.getKey();
    GameObject gameObject = entry.getValue();
    // do something with key or gameObject here...
}

这里有关于Map接口的更多信息: http://docs.oracle.com/javase/7/docs/api/java/util/Map.html

希望这能帮到你。


1
如果您需要访问字符名称(或其他键),可以这样做:
for (String s : characters.keySet()) { 
    GameObject go = characters.get(s);
    if (go instanceof Stat) { 
        System.out.println("Character name: " + s);
        System.out.println("Stats: " + go)
    }
}    

请注意,也可以使用 entrySet() 来避免 get 调用。 - Paul Bellora
@PaulBellora - 我从来没有理解使用 entrySet() 的优势。如果你使用 Map.Entry,你必须使用更多的 get() 调用(既要获取键也要获取值)。 - jahroy
优点在于不需要查找映射中的每个键 - 对于HashMap来说,假设哈希分布均匀,这个优点并不那么重要,但在编写接口代码时遵循这个良好的模式是值得的。基本上是无工作量与一些工作量之间的区别。 - Paul Bellora
@PaulBellora - 感谢您的解释。虽然这让我想知道,如果您知道只会查找很少的键,那么是否仍然最好不要使用Map.Entry - jahroy
总体上我相当喜欢这个语法。今天我正在学习关于哈希映射的一些好信息,谢谢! - CodeManiak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接