-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;
    }
4

3 に答える 3

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;ステートメントは、プログラムが「失敗」してすべてのケースを実行するのを防ぎます。

于 2013-02-10T17:39:50.567 に答える
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
}
于 2013-02-10T17:32:58.793 に答える
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.
}
于 2013-02-10T18:31:07.590 に答える