带有"和" /"或"的多变量开关声明JAVA

时间:2017-11-23 07:05:22

标签: java switch-statement

我是编码游戏编码的新手,每个玩家都有四个统计数据:strcondexint。对于特定的玩​​家种族,用户选择两个增加两个的统计数据,反过来另外两个统计数据减少两个。目前,我正在确定应根据选择增加的数量减少哪些统计数据。 stat1是用户增加的第一个统计信息的名称,stat2是第二个统计信息的名称,这两个统计信息来自用户输入。这是我目前如何将其作为if / else if / else。我想知道它是否可以作为开关语句轻松编写。

if((stat1.startsWith("con") && stat2.startsWith("dex"))||(stat1.startsWith("dex") && stat2.startsWith("con")))
{
    addStat("int",-2);
    addStat("str",-2);
}
else if((stat1.startsWith("con") && stat2.startsWith("int"))||(stat1.startsWith("int") && stat2.startsWith("con")))
{
    addStat("dex",-2);
    addStat("str",-2);
}
else if((stat1.startsWith("con") && stat2.startsWith("str"))||(stat1.startsWith("str") && stat2.startsWith("con")))
{
    addStat("dex",-2);
    addStat("int",-2);
}
else if((stat1.startsWith("dex") && stat2.startsWith("int"))||(stat1.startsWith("int") && stat2.startsWith("dex")))
{
    addStat("con",-2);
    addStat("str",-2);
}
else if((stat1.startsWith("dex") && stat2.startsWith("str"))||(stat1.startsWith("str") && stat2.startsWith("dex")))
{
    addStat("int",-2);
    addStat("con",-2);
}
else if((stat1.startsWith("str") && stat2.startsWith("int"))||(stat1.startsWith("int") && stat2.startsWith("str")))
{
     addStat("dex",-2);
     addStat("con",-2);
}

3 个答案:

答案 0 :(得分:4)

不,不是作为开关声明。但是通过使用集合和循环可以更加简洁:

Set<String> allStats = new HashSet<>(Arrays.asList("dex", "str", "con", "int"));
Set<String> increasedStats = new HashSet<>();
// TODO: let the user choose the stats to increase, 
// and store them in increadedStats

// then decrease the two other ones:
for (String stat : allStats) {
    if (!increasedStats.contains(stat)) {
        addStat(stat, -2);
    }
}

答案 1 :(得分:4)

如果您要定义enum并且具有此枚举类型的stat1stat2,那么您的代码可能非常简单:

public enum Stat {
    DEX,
    INT,
    STR,
    CON;
}

for(Stat stat : EnumSet.complementOf(EnumSet.of(stat1,stat2))) {
    addStat(stat,-2);
}

如果你发现自己写了这么长的if-else-train,你应该总是向后退一步并重新考虑你的设计。

也许最好不要有两个单独的变量stat1stat2,只是从一开始就把它表示为一个集合。

答案 2 :(得分:0)

无法切换多个变量。这在Java文档here中记录如下:

  

开关使用byte,short,char和int原始数据   类型。它也适用于枚举类型(在枚举类型中讨论),   String类,以及一些特定的包装类   原始类型:字符,字节,短整数和整数(在   数字和字符串)。

对不起,如果&#39;那么你将不得不坚持使用。对于这一个。