三元条件运算符中的多个条件?

29

我正在学习Java编程的第一个学期,我们刚刚涵盖了条件运算符(? :)。我有两个问题似乎要求我在彼此之间嵌套条件运算符,这是我可以使用if-else-if语句轻松(但繁琐)完成的事情。

1)"假设month是一个int变量,其值为1或2或3或5 ...或11或12。编写一个表达式,其值为“jan”或“feb”或“mar”或“apr”或“may”或“jun”或“jul”或“aug”或“sep”或“oct”或“nov”或“dec”,根据month的值。(因此,如果month的值为4,则表达式的值将为“apr”。)。"

我想到的一个想法看起来像这样:

(month==1)?"jan":(month==2)?"feb": (month==3)?"mar": (month==4)?"apr": 
(month==5)?"may":(month==6)?"jun": (month==7)?"jul":(month==8)?"aug":
(month==9)?"sep": (month==10)?"oct": (month==11)?"nov": (month==12)?"dec":

(我知道这不是一个完整的表达式,但我不确定如何表达运算符来处理这么多条件。)

2) 假设credits是一个值为0或正数的int变量。编写一个表达式,根据credits的值而产生“大一”、“大二”、“大三”或“大四”。特别地,如果credits的值小于30,则表达式的值为“大一”;30-59将是“大二”,60-89将是“大三”,90或更高则为“大四”。

再次说明,我已经尝试了各种方法,我能想到的最好方法就是以下内容(我可能漏掉了一些必要的括号):

credits < 30 ? "freshman": credits >= 30 && <=59 ?
 "sophomore": credits >= 60 && <= 89 ? "junior": "senior"

我在谷歌上搜索并查看了这里的数据库,但我认为没有任何问题与此完全相同;如果我错了,请原谅。程序(CodeLab)不接受Switch-Case或if-else-if解决方案,总是建议我使用条件?:运算符,但无论我到哪里看,我都不知道如何调整运算符来处理这么多条件。我们在书中还没有过多讨论这个问题,所以如果你们能帮我找到一个解决方案,并且它符合我目前所学的一点,那将是非常好的。


考虑到如果“credits”不小于30,它总是大于等于30,因此该条件是无意义的。 - chris
7个回答

58

对于第一个问题,您确实可以使用三元运算符,但更简单的解决方案是使用一个包含月份描述的String[]数组,并对该数组进行下标操作:

String[] months = { "jan", "feb", "mar", ... };
int month = 1; // jan
String monthDescription = months[month - 1]; // arrays are 0-indexed

现在,针对你的第二个问题,三元运算符似乎更合适,因为你只有少数条件需要满足,虽然我认为使用if会更容易阅读:

String year = "senior";
if (credits < 30) {
  year = "freshman";
} else if (credits <= 59) {
  year = "sophomore";
} else if (credits <= 89) {
  year = "junior";
}

与三元运算符相比,这是一个对比:

String year = credits < 30 ? "freshman" : credits <= 59 ? "sophomore" : credits <= 89 ? "junior" : "senior";

1
我同意第二个问题,if语句更易读。三元运算符选项是正确的,但我仍然在第一个问题上遇到麻烦。我不确定如何使用三元运算符; 我可以使用 month == 1...吗?再次重申,我只有 month == 1 ? "jan" : month == 2 ? "feb" : month == 3 ? "mar" : month == 4 ? "apr" : month == 5 ? "may" : month == 6 ? "jun" : month == 7 ? "jul" : month == 8 ? "aug" : month == 9 ? "sep" : month == 10 ? "oct" : month == 11 ? "nov" : month == 12 ? "dec"。我不理解数组的解释,我们还没有讨论过它们。 - Evan Welser
@EvanWelser:没错,你可以这样做。你的最后一个条件可以简化为 month == 11 ? "nov" : "dec"。没有必要显式地测试 month == 12 - João Silva
谢谢你。我看了你对问题2的回答,那正是我试过的。实际上,它不接受特定条件"month==12",必须是month==11?"nov":"dec",但我不确定为什么程序不接受特定的12月份条件。感谢你的帮助! - Evan Welser
@EvanWelser:不用谢!这是因为如果你有 "nov" : month == 12 ? "dec",你会错过最后三元条件的第三个部分,也就是月份大于12的情况。例如,你需要添加 "nov" : month == 12 ? "dec" : "无效月份" - João Silva

16

括号就像暴力一样:如果不起作用,就多加几个。

但说真的:

( condition A ? value A :
  ( condition B ? value B : 
    ( condition C ? value C :
       ...
    )
  )
)

请不要为任何重要的事情编写那样的代码。


但是,了解运算符优先级和评估顺序仍然是一件好事。 :) - Serge
我同意,如果这不是一个在线作业问题,我可能可以用更易读的方式回答它。我使用了括号,它们似乎有所帮助。谢谢。 - Evan Welser
我只是因为开头那句有趣的小话语而点赞。 - Anonymous

6

(month==1)?"jan":(month==2)?"feb": (month==3)?"mar": (month==4)?"apr": (month==5)?"may":(month==6)?"jun": (month==7)?"jul":(month==8)?"aug": (month==9)?"sep": (month==10)?"oct": (month==11)?"nov": (month==12)?"dec":null

你翻译得很正确,你只需要在最后加上null就行了。


4

我在学习中也有同样的问题。感谢关于ifelse的信息。除非作业要求我们使用条件运算符,否则这将是我的选择。所以基本上他们要求我们用一种难以理解的方式编写它。

(credits < 30) ? "freshman" : (credits >= 30 && credits < 60) ?"sophomore" : (credits >= 60 && credits < 90) ? "junior" : "senior"

这是我的代码,它是正确的。不过我在想是否有更短的代码(只使用条件运算符)。顺便说一下,Evan的代码几乎是正确的,只是每个表达式周围缺少了一些括号。

2
把你的代码放在括号中,并在末尾添加 null,就可以了。

1
你正確地處理了三元條件中的if-else-if情況,但你的語法稍微有點問題(正如你所說的)。
然而,我會稍微改變它,使得不必要的額外條件不會被檢查。
String year = credits < 30 ? "freshman": credits <= 59
       ? "sophomore": credits <= 89 ? "junior" : "senior";

但是为了代码可读性,你最好的选择就是使用if和else语句。


1

-在我的情况下,我有一个基于标志的"isloadingMakePayment",我必须实现一个Loading bar在该标记上。这意味着当isloadingMakePayment为真时,标记显示"Loading Data..."而不是其他内容。已经实现了多个条件。

-"isPolicyRename"也是一个标志,我用它来进行内部条件判断。同时,"renamePolicy"是一个变量,其中包含一些值,我用它来在HTML页面上显示。

  • 只需使用此模式:

<a class="btn btn-orange" (click)="onMakePayment()"> <span *ngIf="isloadingMakePayment"><i class='fa fa-spinner fa-spin'></i>Loading Data...</span>{{isloadingMakePayment ? '' : isPolicyRename 'Make Payment to ' + renamePolicy : 'Make Payment' }} </a>


谢谢。

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