2016-11-05 4 views
0

모두 다음 if 문을 switch 문으로 변환하려고했습니다.if-else 문을 switch 문으로 변환하려고했지만 오류로 끝나는 경우

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; 

} 

내가 이것을 실행하려고, 일식 "의 경우 표현식은 상수 식이어야합니다"고 각각의 경우 조건에 대해 나에게 오류를 제공합니다

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

내 시도였다. 이 문제를 극복하는 방법을 모르겠습니다. 누구든지 나를 도울 수 있습니까? 감사. switch 문에서 case에서

+0

'사례 표현식은 상수 표현식이어야합니다. '여기 스위치 케이스는 사용할 수 없습니다. 모두 – 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에 유용한 정보를 제공한다고 생각합니다. [테이블 기반] (http://stackoverflow.com/a/40439163/2071828) 접근 방식은 확실히 더 깔끔하고 확장 성이 뛰어납니다. –

4

이클립스가 당신에게하려고하는 바와 같이,이 자바로 할 수 없습니다. 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 '을 사용할 수 있습니다. 여기서'key -는'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

약 한 시간 전에 게시하지 않았습니까? –