2016-11-05 11 views
0

すべて私は次のifステートメントをswitchステートメントに変換しようとしていました。if-elseステートメントをswitchステートメントに変換しようとしましたが、エラーが発生しました。

/** 
* Return appropriate comment for given score and par for hole. 
* You can assume that score is not less than 4 below par for hole. 
* For example, if score is 4 below par, return "condor!!!!", 
* if score is 3 below par, return "albatross!!!", 
* if score is 2 below par, return "eagle!!", etc. 
* See Assign 2 description for full list of comments. 
* @param score 
* @param parForHole 
* @return appropriate comment for given score and par for hole. 
*/ 
public static String comment(int score, int parForHole) { 
    if (score == parForHole-4) 
     return "condor!!!!"; 
    if (score == parForHole-3) 
     return "albatross!!!"; 
    if (score == parForHole-2) 
     return "eagle!!"; 
    if (score == parForHole-1) 
     return "birdie!"; 
    if (score == parForHole) 
     return "par"; 
    if (score == parForHole+1) 
     return "bogey"; 
    if (score == parForHole+2) 
     return "double bogey"; 
    if (score == parForHole+3) 
     return "triple bogey"; 

return "Not valid"; // Replace by a suitable switch stmt. 
} 

これは私の試みだった:私はこれを実行しようとすると

public static String comment(int score, int parForHole) { 

    String monthString; 
     switch (score) { 
      case parForHole-4: monthString = "condor!!!!"; 
        break; 
      case parForHole-3: monthString = "albatross!!!"; 
        break; 
      case parForHole-2: monthString = "eagle!!"; 
        break; 
      case parForHole-1: monthString = "birdie!"; 
        break; 
      case parForHole: monthString = "par"; 
        break; 
      case parForHole+1: monthString = "bogey"; 
        break; 
      case parForHole+2: monthString = "double bogey"; 
        break; 
      case parForHole+3: monthString = "triple bogey"; 
        break; 
      default: monthString = "Invalid"; 
        break; 
     } 
     return monthString; 

} 

、日食は私に、「ケース式は定数式でなければならない」という、それぞれの場合の条件のためにエラーが発生します。この問題を克服する方法がわかりません。誰か助けてくれますか?ありがとう。 switch文のcase

+0

'case式は定数式でなければなりません.'ここではswitch caseを使うことはできません。それはすべてです – Danh

答えて

3

アイテムがコンパイル時定数でなければなりません:

public static String comment(int score, int parForHole) {  
     switch (score - parForHole) { 
      case -4: 
        return "condor!!!!"; 
      case -3: 
        return "albatross!!!"; 
      case -2: 
        return "eagle!!"; 
      case -1: 
        return "birdie!"; 
      case 0: 
        return "par"; 
      case 1: 
        return "bogey"; 
      case 2: 
        return "double bogey"; 
      case 3: 
        return "triple bogey"; 
      default: 
        return "Invalid"; 
     } 
} 
+0

ありがとう!私は最近、switch文について最近学んだだけで、switch文がどのように定数になることができるのか分からなかった! – Dan

+0

あまりにも厄介に見える:)と将来の間違いの原因と思われる – Andrew

+1

@AndrewTobilkoはちょっとやっている、あなたは正しい。それは書かれているように質問に答えて、私はそれがOPに有用な情報を提供すると思います。 [table based](http://stackoverflow.com/a/40439163/2071828)のアプローチは、確かに、より洗練され、より拡張性があります。 –

4

のEclipseはあなたを教えしようとしているように、これはJavaで可能ではありません。 定数式はcase文でのみ使用できますが、状況に合わない場合があります。

いずれにしても、if-elseもスイッチも素晴らしいわけではありません。

static String[] comments = { 
    "condor!!!!", 
    "albatross!!!", 
    "eagle!!", 
    "birdie!", 
    "par", 
    "bogey", 
    "double bogey", 
    "triple bogey" 
}; 

public static String comment(int score, int parForHole) { 
    int index = score - parForHole + 4; 
    if (index < 0 || index >= comments.length) { 
     return "Not valid"; 
    } 
    return comments[index]; 
} 
+0

または 'Map 'を使うことができます。ここで、キーは 'index'に' 4'を加えるのではなく 'score - parForHole'です。これは、インデックスチェックを削除します。+1 – Andrew

+0

ハッシュマップにはストレージオーバーヘッドがあり、スキップされた値を持たない整数シーケンスであるマップは、代わりに単純な配列を使用する必要があります。 – janos

0

が代わりにこれを試してみてください: 例えば、テーブルベースのソリューションを使用する方が良いでしょう

public static String comment(int score, int parForHole) { 

String monthString; 
    switch (score - parForHole) { 
     case -4: monthString = "condor!!!!"; 
       break; 
     case -3: monthString = "albatross!!!"; 
       break; 
     case -2: monthString = "eagle!!"; 
       break; 
     case -1: monthString = "birdie!"; 
       break; 
     case 0: monthString = "par"; 
       break; 
     case +1: monthString = "bogey"; 
       break; 
     case +2: monthString = "double bogey"; 
       break; 
     case +3: monthString = "triple bogey"; 
       break; 
     default: monthString = "Invalid"; 
       break; 
    } 
    return monthString; 

あなたの例外の原因は、あなたが計算をやろうとしているということですcaseステートメント - 許可されていません(例外状態として、静的な値のみが許可されています)。上記の解決策は、計算をswitchステートメントに引き込み、問題を解決します。

+0

私はこれを1時間ほど前に投稿していませんでしたか? –

関連する問題