0

在我正在进行的一个小项目中,我陷入了困境。用户输入一个可能是“xp Speed”的命令,我的命令处理程序类发现它想要Speed Instance的XP值。在这种情况下,它需要将 Skill.Speed.currentXP 的值返回给用户。

程序的一小部分:

//Example Instance initialization there is over 40 of these
Skill Speed = (new SkillSpeed(Skills.SKILL_SPEED,Skills.SKILL_SPEED_MODIFIER));

//Constructor for skill class
public Skill(String skillName, double modifier) {
    this.name  = skillName;
    this.minLevel = Skills.MIN_SKILL_LEVEL;
    this.Modifier = 1f;
    this.currentLevel = (int)calculateLevel();
    this.currentXP = 1;
    this.leaderboard = getCurrentLeaderboard();
    this.ID = getNextID();
}

现在,我有一种方法可以做到这一点。通过使用带有 case 值的 switch 语句作为输入的字符串。但是,我确信在一个 switch 语句中有 40 多个案例是可以避免的。我的另一个理论是创建一个包含所有当前实例的数组,然后遍历该列表,查找用户输入的字符串是否等于该实例的名称,然后返回该实例本身。这就是我想出的:

//method inside another classs that attempts to return the appropriate skill Instance
public Skill getSkillFromName(String Name) {
    for(int i = 0; i < Skill.SkillArray.length; i++) {
        final String SkillName = Skill.SkillArray[i].getName();
        if(SkillName.equalsIgnoreCase(Name)) {
            return Skill.SkillArray[i];
        }
    }
    return null;
}

所以这就是我需要帮助的地方:

  • 创建所有已初始化实例的数组

  • 创建将返回 Skill."InsertRandomInstanceDependingOnUserInputHere".currentXP 的方法

  • 修复您在 getSkillFromName() 方法中看到的任何问题

或者也许我忽略了一种更简单的方法,你可以帮助我。

谢谢您的帮助,

BigDaveNz

4

2 回答 2

0

您可以Map为此使用 a 。例如:

Map<String, Skill> skills = new HashMap<String, Skill>();

要插入值,请将值放入Map

skills.put(skill.getName(), skill);

要检索您的技能,您可以按名称获取技能:

Skill skill = skills.get(name);
于 2013-07-02T09:17:14.177 回答
0

如果技能名称与方法名称完全匹配,您可能会在“ How do I invoke a Java method when given the method name as a string? ”中找到答案。

要按名称查找实例,您仍然可以使用Map's.

于 2013-07-02T09:22:55.333 回答