我怎样才能缩短这一点?
问题描述:
我得到了一个基于用户输入定义季节的方法。 例如: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;
}
答
您可以通过使用相同的结果扔掉不必要的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
}
答
使用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
好得多,因为它很简单。声明使程序免于“堕入”并执行每个案例。
答
下面是使用Java日历类查看问题的另一种方法。例如(未经测试的代码)由于您需要闰年检测,因此它稍微复杂一些,但正如我所说的,以不同的方式来思考问题。
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 2013-07-23 20:53:46
只需将多个测试合并为一个:'if(month = 21){result ='WINTER'} else {...'等一些测试是不必要的,例如'month == 2 && day> = 1'。 – 2013-02-10 17:29:16
对不起,我正在玩的代码尝试不同的选项,忘了改回那部分。 – SkyVar 2013-02-10 17:30:14