web-dev-qa-db-ja.com

三項条件演算子の複数の条件?

Javaプログラミングの最初の学期を受講しており、条件演算子(?:)の条件について説明しました。条件演算子を「ネスト」したいと思われる2つの質問があります。お互いの中で、if-else-ifステートメントで簡単に(まだ退屈に)できること。

1) "月は、値が1または2または3または5 ...または11または12のint変数であると想定します。値が" 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は、値が0または正のint変数であると想定します。クレジットの値に基づいて、値が「新入生」または「2年生」または「ジュニア」または「シニア」である式を記述します。特に、クレジットの値が30未満の場合、式の値は「新入生」です。 30-59は「2年生」、60-89は「ジュニア」、90以上は「シニア」になります。

繰り返しになりますが、私はいじくり回していて、思いつくことができる最善の方法は次のようなものです(そして、必要な括弧がいくつか欠落している可能性があります):

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

私はグーグルで検索してここのデータベースをチェックしましたが、この質問とまったく同じようなものがあるとは思いません。私が間違っていたら許してください。プログラム(CodeLab)はSwitch-Caseやif-else-ifソリューションを使用せず、常に条件付きを使用する必要があることを示唆していますか? :オペレーターですが、どこを見ても、オペレーターをリグして非常に多くの条件を処理する方法がわかりません。私たちは本の中でこれをはるかに超えていないので、皆さんが私が解決策を見つけるのを手伝ってくれるなら、それが私がこれまでに学んだ少しでジャイブするものであれば素晴らしいでしょう。

7
Evan Welser

first質問の場合、実際には3項演算子を使用できますが、より簡単な解決策はString[]月の説明を入力し、次の配列に添え字を付けます。

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

さて、あなたのsecond質問の場合、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";
19
João Silva

括弧は暴力のようなものです。それが機能しない場合は、もっと使用してください。

しかし真剣に:

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

そして、重要なことのためにそのようなコードを書かないでください。

7
willglynn

(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

あなたはそれを正しく理解しました、あなたが必要とする唯一のものはあなたがそれをすべて終えたときの最後のヌルです。

2
shona

私の研究でも同じ質問がありました。 ifelseに関する情報をありがとう。割り当てが条件演算子を使用するように具体的に要求していることを除いて、私の選択でもあります。だから基本的に彼らは私たちにそれを読めない方法で書くように頼んでいます。

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

これは私のものであり、正しいものでした。 (条件演算子のみを使用して)より短いコードがあるかどうか疑問に思っています。

ちなみに、Evanのコードはほとんど良かったです。各式の周りのいくつかの括弧を見逃しただけです。

2
Jurgen Ermans

あなたはif-else-ifシチュエーションの概念を三項で正しく処理していますが、構文は少しずれていました(あなたが言ったように)。

ただし、余分な条件が不必要にチェックされないように、少し変更します。

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

ただし、コードを読みやすくするために、ifステートメントとelseステートメントを使用するのが最善のオプションです。

0
FThompson

コードを角括弧で囲み、最後にnullを追加すれば、あなたは黄金です。

0
Owen Delisle