三元条件运算符中的多个条件?
Posted
技术标签:
【中文标题】三元条件运算符中的多个条件?【英文标题】:Multiple conditions in ternary conditional operator? 【发布时间】:2012-09-14 22:59:39 【问题描述】:我正在学习 Java 编程的第一个学期,我们刚刚介绍了条件运算符 (? :) 条件。我有两个问题似乎希望我将条件运算符“嵌套”在彼此之间,我可以很容易地(但很乏味地)用 if-else-if 语句来做这件事。
1) "假设月份是一个int变量,其值为1或2或3或5 ...或11或12。写一个值为“jan”或“feb”或“mar”或“的表达式apr”或“may”或“jun”或“jul”或“aug”或“sep”或“oct”或“nov”或“dec”基于月份的值。(因此,如果月份的值是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 是一个 int 变量,其值为 0 或正数。根据学分的值写一个表达式,其值为“freshman”或“sophomore”或“junior”或“senior”。特别是:如果 credits 的值小于 30,则表达式的值是“freshman”; 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,所以这个条件是没有意义的。
【参考方案1】:
对于first问题,您确实可以使用三元运算符,但更简单的解决方案是使用带有月份描述的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";
【讨论】:
我同意第二个问题,if 更容易阅读。三元运算符选项是正确的,但我仍然遇到第一个问题。我对如何使用三元运算符感到困惑;我可以使用月份== 1 ...吗?再一次,我只有一个月 == 1 吗? “一月”:月 == 2? “二月”:月 == 3 ? “mar”:月 == 4? “四月”:月 == 5 ? “可能”:月 == 6 ? “君”:月== 7? “七月”:月 == 8 ? “八月”:月 == 9 ? “sep”:月 == 10 ? “八月”:月 == 11 ? “新月”:月 == 12 ? "dec" 我不明白数组的解释,我们还没有讨论过。 @EvanWelser:你可以,是的,这是正确的。您的最后一个条件可以简化为month == 11 ? "nov" : "dec"
。无需显式测试month == 12
。
谢谢。看看你对 2 的回答,这就是我最终尝试的方法。它实际上不接受特定条件“月==12”,它必须是月== 11? "nov" : "dec" 但我不确定为什么程序不接受 12 特定条件。感谢您的帮助!
@EvanWelser:不客气!那是因为如果你有 "nov" : month == 12 ? "dec"
,你错过了最后一个三元条件的 third 部分,即月份大于 12 的情况。你必须添加例如 @987654329 @.【参考方案2】:
括号就像暴力:如果它不起作用,请使用更多。
但是说真的:
( condition A ? value A :
( condition B ? value B :
( condition C ? value C :
...
)
)
)
请不要为任何重要的事情编写这样的代码。
【讨论】:
但是,知道运算符的优先级和评估顺序仍然是一件好事。 :) 我同意,如果这不是一个在线作业问题,我可能会以更具可读性的方式回答它。我使用了括号,它们似乎有所帮助。谢谢【参考方案3】:(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
你说得对,你唯一需要的是当你完成这一切时最后的空值。
【讨论】:
【参考方案4】:我在学习时也有同样的问题。感谢您提供有关if
和else
的信息。也是我的选择,除了任务要求我们专门使用条件运算符。所以基本上他们要求我们以不可读的方式编写它。
(credits < 30) ? "freshman" : (credits >= 30 && credits < 60) ?"sophomore" : (credits >= 60 && credits < 90) ? "junior" : "senior"
这是我的,而且是正确的。我想知道是否有更短的代码(仅使用条件运算符。)。
顺便说一句,Evan 你的代码几乎是好的。只是错过了每个表达式周围的一些括号。
【讨论】:
【参考方案5】:您正在正确处理三元组中 if-else-if 情况的想法,但您的语法略有偏差(正如您所说的那样)。
不过,我会稍微改变它,以免不必要地检查额外的条件。
String year = credits < 30 ? "freshman": credits <= 59
? "sophomore": credits <= 89 ? "junior" : "senior";
但是为了代码的可读性,最好的选择是使用 if 和 else 语句。
【讨论】:
【参考方案6】:把你的代码放在括号里,最后加上null,你就成功了。
【讨论】:
【参考方案7】:-就我而言,我有一个 "isloadingMakePayment" 标志,该标志基于我必须在该标签上实现 Loading bar 的标志。这意味着当 isloadingMakePayment 是真正的标签显示 "Loading Data..." 代替。实现了多个条件。
-An "isPolicyRename" 也是我用于内部条件的标志。MeanWhile "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>
谢谢。
【讨论】:
以上是关于三元条件运算符中的多个条件?的主要内容,如果未能解决你的问题,请参考以下文章