2013-02-10 3 views
-2

사용자가 입력 한 내용에 따라 시즌을 정의하는 메소드가 있습니다. 예 : 1/6 = 겨울 이 코드를 모두 사용하는 대신이 작업을 쉽게 수행 할 수있는 것처럼 보입니다. 어떤 제안?어떻게 단축 할 수 있습니까?

public String getSeason() 
    { 
     String result = "UNKNOWN"; 

     if (month == 1 && day >= 1) 
     { 
      result = "WINTER"; 
     } 
     else if (month == 2 && day >= 1) 
     { 
      result = "WINTER"; 
     } 
     else if (month == 3 && day <= 20) 
     { 
      result = "WINTER"; 
     } 
     else if (month == 3 && day >= 21) 
     { 
      result = "SPRING"; 
     } 
     else if (month == 4 && day >= 1) 
     { 
      result = "SPRING"; 
     } 
     else if (month == 5 && day >= 1) 
     { 
      result = "SPRING"; 
     } 
     else if (month == 6 && day <= 20) 
     { 
      result = "SPRING"; 
     } 
     else if (month == 6 && day >= 21) 
     { 
      result = "SUMMER"; 
     } 
     else if (month == 7 && day >= 1) 
     { 
      result = "SUMMER"; 
     } 
     else if (month == 8 && day >= 1) 
     { 
      result = "SUMMER"; 
     } 
     else if (month == 9 && day <= 22) 
     { 
      result = "SUMMER"; 
     } 
     else if (month == 9 && day >= 23) 
     { 
      result = "FALL"; 
     } 
     else if (month == 10 && day >= 1) 
     { 
      result = "FALL"; 
     } 
     else if (month == 11 && day >= 1) 
     { 
      result = "FALL"; 
     } 
     else if (month == 12 && day <= 20) 
     { 
      result = "FALL"; 
     } 
     else if (month == 12 && day >= 21) 
     { 
      result = "FALL"; 
     } 
     return result; 
    } 
+2

그냥 하나에 여러 테스트를 결합 :'경우 (월 <3 || 개월 == 3 && 일 <= 20 || 개월 == 12 && 일> = 21) {결과 = '겨울'} 다른 {...} 등등. 몇몇 테스트는 불필요합니다. 예를 들면'month == 2 && day> = 1'입니다. –

+0

죄송합니다. 다른 옵션을 시도하는 코드를 가지고 놀고 있었고 해당 부분을 다시 잊어 버렸습니다. – SkyVar

답변

2

동일한 결과로 불필요한 day >= 1 (? 그것은 다른 무엇을 할 수 있음)와 결합 개월을 멀리 던져을 단축 할 수 있습니다

if (month <= 2 || (month == 3 && day <= 20) || (month == 12 && day >= 21)) { 
    // Winter 
} else if (month <= 5 || (month == 6 && day <= 21)) { 
    // Spring 
} else if (month <= 8 || (month == 9 && day <= 22)) { 
    // Summer 
} else { 
    // Fall 
} 
4

switch를 사용합니다.

switch (month) { 
    case 1: case 2: /* Winter */; break; 
    case 3: if (day <= 20) {/* Winter */} else {/* Spring */} break; 
    case 4: case 5: /* Spring */; break; 
    case 6: if (day <= 21) {/* Spring */} else {/* Summer */} break; 
    // Continue the pattern... 
    default: /* Unknown */; break; 
} 

이것은 단순하기 때문에 if-else 래더보다 훨씬 낫습니다. break; 문장은 프로그램이 "빠져 나가는"것을 막고 모든 경우마다 실행합니다.

0

다음은 Java Calendar 클래스를 사용하여 문제를 보는 다른 방법입니다. 예 : (테스트되지 않은 코드) 윤년 탐지를하지 않으면 조금 더 복잡하지만, 내가 말했듯이, 문제에 대해 생각하는 다른 방법이다.

public String testSeason(int year, int month, int day) { 
    //month is 0 based! 

    int FIRST_DAY_OF_SPRING = 31 + 28 + 21; // might need leap year detection to be completely accurate. 
    int FRIRST_DAY_OF_SUMMER = FRST_DAY_OF_SPRING + 10 + 31 + 30 +31; 
// define FALL and WINTER similarly. 

    Calendar testDate = new Calendar(); 
    testDate.set(year,month,day); 

    if (testDate.get(Calendar.DAY_OF_YEAR) < FIRST_DAY_OF_SPRING) return "Winter"; 
    if (testDate.get(Calendar.DAY_OF_YEAR) < FIRST_DAY_OF_SUMMER) return "Spring"; 
// continue for rest of seasons. 
} 
+0

문제를 수치로 풀어 낼 수있을 때 왜 객체 등을 만들고 그 모든 오버 헤드를 소개합니까? – MathSquared

관련 문제