用switch case简化以下代码?

时间:2012-01-18 19:33:41

标签: java

我试图检查日期的有效性。我只能使用else和切换案例。我不确定是否可以简化以下内容。

if (monthNum<1||monthNum>12){
    validDate=false;
    System.out.println("Invalid Date Entered");
}

else if ((monthNum==1||monthNum==3||monthNum==5||monthNum==7||monthNum==8||monthNum==10||monthNum==12)&&(dayNum<1||dayNum>31)) {
    validDate=false;
    System.out.println("Invalid date entered");
}

else if ((monthNum==4||monthNum==6||monthNum==9||monthNum==11)&&(dayNum<1||dayNum>30)){
    validDate=false;
    System.out.println("Invalid date entered");
}

else if (monthNum==2 &&(dayNum<1||dayNum>28)) {
    validDate=false;
    System.out.println("Invalid date entered");
}

else {
    validDate=true;
}

8 个答案:

答案 0 :(得分:2)

(简化的简化条件)

if (a){
    validDate=false;
    System.out.println("Invalid Date Entered");
}

else if (b) {
    validDate=false;
    System.out.println("Invalid date entered");
}

else if (c){
    validDate=false;
    System.out.println("Invalid date entered");
}

else if (d) {
    validDate=false;
    System.out.println("Invalid date entered");
}

else {
    validDate=true;
}

可以更改为:

boolean validDate = !(a||b||c||d);

这有帮助吗?

答案 1 :(得分:1)

以下是您可以考虑的一些事项:

在精心设计的软件中,此验证可能会出现在自己的方法中:

bool validateDate(int monthNum, int dayNum) {
     // your code goes here
}

我们还可以将月和日验证分成他们自己的方法,例如:

bool validateMonth(int monthNum) {
    return (1 <= monthNum) && (monthNum <= 12)
}

bool validateDay(int monthNum, int dayNum) {
    // ...
}

对于validateDay方法的内部,任何小于1的日子都不好,所以我们可以把它拉出来:

if (day < 1)
    return false;

我肯定会在其余部分使用开关:

switch(monthNum) {
    case 1:
    case 3:
    // ...
    case 12:
        return dayNum <= 31;
    // similarly for the other months
    // ...
    case default:
        // should probably do something about invalid monthNum
}

这两种方法很容易通过

组合
bool validateDate(int monthNum, int dayNum) {
    return validateMonth(monthNum) && validateDay(dayNum);
}

这不是对代码的重大改变(它几乎具有相同的流程),但它更有条理,而switch可以更方便地处理多个==检查。

答案 2 :(得分:0)

我建议不要编写自己的日期检查逻辑,而是使用setLenient(false)查看java.util.Calendar。

检查http://docs.oracle.com/javase/6/docs/api/java/util/Calendar.html#setLenient(boolean)上的JavaDocs

答案 3 :(得分:0)

boolean validateDate(int monthNum, int dayNum) {
    if (dayNum < 1)
        return false;
    switch (monthNum) {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        return dayNum <= 31;
    case 4:
    case 6:
    case 9:
    case 11:
        return dayNum <= 30;
    case 2:
        return dayNum <= 28;
    }
    return false;
}

答案 4 :(得分:0)

1-28始终有效。从那开始。只有在数字为&gt;时才进行切换。 28。

答案 5 :(得分:0)

首先,在一开始就进行一次检查以获取dayNum&lt; 1.我不知道任何一个月的第0天。: - )

如果保留当前的if / else系统,我至少会将月份检查与月份检查分开。此外,我个人的偏好,使逻辑积极 - 这通常更容易遵循。一两条评论会很好......

e.g。

// Thirty days hath September, April, June, and November
else if ((monthNum==4||monthNum==6||monthNum==9||monthNum==11)) {
    validDate = dayNum<=30;  // note that logic is now "positive"
    if (!validDate)
       System.out.println("Invalid date entered");
}

我不知道你在课程中的位置,但是你考虑过使用数组吗?一个12个整数的数组,这12个月中的每一个的最大日期都是有用的。

答案 6 :(得分:0)

从mergeconflict的答案中添加闰年处理:

private static boolean validateDate(int yearNum, int monthNum, int dayNum) {

if (monthNum < 1 || monthNum > 12) return false;
if (dayNum < 1 ) return false;

switch(monthNum) {
  case 1: case 3: case 5: case 7: case 8: case 10: case 12:
    return dayNum <= 31;
  case 4: case 6: case 9: case 11:
    return dayNum <= 30;
  default: // 2
    boolean leapYear = (yearNum % 4 == 0 && yearNum % 100 != 0) || yearNum % 400 == 0;
    if (leapYear) {
      return dayNum <= 29;
    } else {
      return dayNum <= 28;
    }
}

}

答案 7 :(得分:0)

以下内容较短,它使用的事实是,您可以将更详细的检查添加到始终保持的检查(即所有月份少于32天),并将sysout消息移动到所有测试完成的位置。

boolean validDate = (monthNum >= 1 && monthNum <= 12 && dayNum >= 1 && dayNum <= 31);

if (monthNum == 4 || monthNum == 6 || monthNum == 9 || monthNum == 11) {

    validDate &&= (dayNum <= 30);
}

else if (monthNum == 2) {

    validDate &&= (dayNum <= 28);
}

if (!validDate) {
    System.out.println("Invalid Date Entered");
}

如果允许使用查找表,您可以进一步简化:

int[] monthDays = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

boolean validDate = (monthNum >= 1 && monthNum <= 12 && 
                     dayNum >= 1 && dayNum <= monthDays[monthNum - 1]);

if (!validDate) {
    System.out.println("Invalid Date Entered");
}