从hashmap值获取对象的属性

polkgigr  于 2021-07-08  发布在  Java
关注(0)|答案(3)|浏览(329)

我正在用java开发一个基于文本的冒险游戏,我试图找出一种方法来检查玩家拥有什么武器,并适当地设置他们的伤害输出。
以下是我目前的设置:
项目对象:

Item (String name, String type, String description, String location)

("Assault Rifle", "rifle", "A rifle that goes pew pew.", "armory")

玩家清单:

HashMap<String, Item> inventory = new HashMap<String, Item>()

现在,我可以使用if语句获取对象的名称,并为其设置伤害修饰符:

if (player.getInventory().containsKey("Assault Rifle")) {
        player.setMaxAttackDmg(55);
        player.setWeaponModifier(2);
    }

我想做的是匹配项目类型,而不是名称。我假设我需要某种循环来遍历播放器的清单,但是我不知道如何匹配hashmap值,因为它是item类型的对象。所以它会有这样的东西:

for (item in inventory) {
    if (item.getType().equals("rifle")) {
        player.setMaxAttackDmg(55);
        player.setWeaponModifier(2);
    }

有没有办法,或者更好的办法?

2g32fytz

2g32fytz1#

我会做一个
Weapon Enum 具有以下特性 maxAttackDmg . 然后您可以简单地获取枚举的属性,而不知道它是什么示例。如果武器需要有复杂的行为,并且不仅仅是数据类,那么这些应该是常规类,而不是枚举。

kd3sttzy

kd3sttzy2#

您可以遍历Map的值来检索项,然后应用测试:

public Item find(String type) {
    for(final Item item : inventory.values()) {
        if(item.type().equals(type)) {
            return item;
        }
    }
    return null; // or throw an exception
}

这当然不是最面向对象的方法;)但它做你想做的。
您可能需要查看map类的其他访问器,例如 keySet 以及 entrySet 查看库存的其他方法。
一旦您有了工作,您可能还想研究java8流,它以一种更加优雅和可读的方式支持这种功能。

7xzttuei

7xzttuei3#

你已经知道如何使用循环,你的方法是有效的。
从Map中检索此值的更好方法是使用流并筛选出第一次出现的值,然后在玩家的资源清册中包含此值时执行操作。
例如:

inventory.values()
    .stream()
    .filter(item -> item.type().equals(type))
    .findFirst()
    .ifPresent(item -> /*your action*/);

此外,我建议您以更面向对象的方式重构代码,例如,根据您提供的代码片段,您可以创建一个名为武器的项目子类,并有一个方法亲自装备您的武器并增加您的属性,例如:

private void equipWeapon(Weapon weapon){
    player.setMaxAttackDmg(weapon.getAttackDamage());
    player.setWeaponModifier(weapon.getModifier());
  }

相关问题