2016-11-05 3 views
0

alles, was ich versucht habe, die folgende if-Anweisung in eine switch-Anweisung umzuwandeln.Versucht, eine if-else-Anweisung in eine switch-Anweisung umzuwandeln, aber mit einem Fehler zu enden

/** 
* 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. 
} 

Dies war mein Versuch:

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; 

} 

Wenn ich versuche, dies zu laufen, gibt mir Eclipse Fehler für jeden Fall Bedingung, dass „Fall Ausdrücke konstanter Ausdrücke sein muss“. Ich bin mir nicht sicher, wie ich dieses Problem lösen kann. Kann mir jemand helfen? Vielen Dank.

+0

'case Ausdrücke müssen konstante Ausdrücke sein, Sie können nicht Schalter Fall hier verwenden, das ist alles – Danh

Antwort

3

Artikel in einer case in einer switch Anweisung muss Kompilierung konstant sein:

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

Vielen Dank! Ich habe gerade erst über Switch-Anweisungen erfahren und wusste nicht, dass Switch-Anweisungen nur Konstanten sein können! – Dan

+0

sieht zu schmuddelig :) und scheint die Ursache für zukünftige Fehler zu sein – Andrew

+1

@AndrewTobilko tut ein bisschen, du hast Recht. Es beantwortet die Frage wie geschrieben und ich denke, es liefert nützliche Informationen für das OP. Der [table-based] (http://stackoverflow.com/a/40439163/2071828) Ansatz ist sicherlich sauberer und erweiterbarer. –

4

Eclipse Sie versucht zu sagen, dies ist in Java nicht möglich. Sie können in case-Anweisungen nur konstante Ausdrücke verwenden, die in Ihrer Situation nicht gut passen.

Wie auch immer, weder if-else noch Schalter sind hier super. Es wäre besser, eine tabellenbasierte Lösung zu verwenden, zum Beispiel:

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

oder Sie können eine 'Map ' verwenden, wobei ein Schlüssel 'score - parForHole' ist, anstatt '4' zum' index' hinzuzufügen. Es entfernt die Indexprüfung, +1 – Andrew

+0

Sie * konnte *, aber bedenken Sie, dass Hash-Maps einen Speicheraufwand haben, und dass Maps, wo die Schlüssel eine Ganzzahlsequenz ohne übersprungene Werte sind, wirklich ein einfaches Array verwenden. – janos

0

dieses Versuchen Sie stattdessen:

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; 

Die Ursache für die Ausnahme ist, dass Sie versuchen, eine Berechnung in der zu tun case Anweisung - was nicht erlaubt ist (wie die Ausnahmen Staaten, hier sind nur statische Werte erlaubt). Die obige Lösung zieht die Berechnung in die switch-Anweisung und behebt daher Ihr Problem.

+0

Habe ich das nicht vor etwa einer Stunde gepostet? –

Verwandte Themen