如何通过不获取另一种情况的值来制作if语句在switch情况下?

时间:2018-07-08 09:52:39

标签: java algorithm switch-statement

现在我有一个问题要在此运行我的代码 我要检查情况2的februay是否为year,而不是如果错误则运行execute if语句,它将变为默认值,但现在转到情况3的语句如何解决不是转到情况3而是去设为默认值?

//这是我的代码

public static void main(String[] args) {
    getDaysInMonth(1, 2018);
    System.out.println(getDaysInMonth(2, 2018));

}

public static boolean isLeapYear(int year) {
    if(year < 1 && year > 9999) {
        return false;
    } else {
        if(year % 4 == 0) {
            return true;
        } else if(year % 100 == 0) {
            return false;
        } else if(year % 400 == 0) {
            return true;
        } else {
            return false;
        }
    }         
}

public static int getDaysInMonth(int month, int year) {
    if((month < 1 || month > 12) && (year < 1 || year > 9999)) {
        return -1;
    }
    isLeapYear(year);
    int days;
    switch(month) {
        case 1:
            days = 31;
            break;
        case 2:
            if(year == 1) {
                days = 29;
                break;
            } 

        case 3:
            days = 31;
            break;
        case 4:
            days = 30;
            break;
        case 5:
            days = 31;
            break;
        case 6:
            days = 30;
            break;
        case 7:
            days = 31;
            break;
        case 8:
            days = 31;
            break;
        case 9:
            days = 30;
            break;
        case 10:
            days = 31;
            break;
        case 11:
            days = 30;
            break;
        case 12:
            days = 31;
            break;                
        default:
            days = 28;
            break;             
    }
      return days; 
}

2 个答案:

答案 0 :(得分:4)

之所以会这样,是因为您的breakIF范围内->如果年份不是1,则继续第3种情况。

您可以使用if else子句:

    case 2:
        if(year == 1) {
            days = 29;
        } else {
            days = 28;
        }
        break;

但是我要提醒您,year != 1并不意味着它的2月获得28天,也许您想要这样:

    case 2:
        if(!isLeapYear(year)) {
            days = 29;
        } else {
            days = 28;
        }
        break;

答案 1 :(得分:2)

除了关于if语句和switch的问题之外,首先使用leap年检查的方法还需要解决一些问题。这是下面原始代码的开头:

public static boolean isLeapYear(int year) {
    if(year < 1 && year > 9999) {
        return false;
    } else {
        ...

year < 1 && year > 9999永远不会发生,因为year不能同时小于1和大于9999,所以这是多余的。

除此之外,用于确定年份是否为leap年的算法如下(以纯英语显示):

  1. 查看该年份是否可以被4整除。如果不是,则该年份不能是a年(返回false)。
  2. 这里一年可以平均除以4(在步骤1中确定)。如果不能被100整除,则为is年(返回true)。
  3. 此处的年份可以被4除以100,也可以除以100。如果该年份也可以除以400,那么它就是a年。否则不是。

将以上所有注意事项放入代码中,可以使其更具可读性:

public static boolean isLeapYear(int year) {
    if (year % 4 != 0) {
        // year is not evenly divisible by 4 (it has a remainder, can't be a leap year). 
        return false;
    }
    // year is evenly divisible by 4
    if (year % 100 != 0) {
        // divisible by 4 and not 100, it's a leap year
        return true;
    }
    // divisible by 4 and also 100
    if (year % 400 != 0) {
        // divisible by 4, 100 and not by 400
        return false;
    }

    // divisible by 4, 100 and 400
    return true;
}

考虑到您的getDaysInMonth方法,我们遇到以下情况,其中1 = 1月,2 = 2月,依此类推:

30天:9月(9),4月(4),6月(6),11月(11)

31天:除2月(2)以外的所有其他日子(a年28、29)

public static int getDaysInMonth(int month, int year) {
    switch (month) {
        case 9:
        case 4:
        case 6:
        case 11:
            return 30;
        case 2:
            if (isLeapYear(year)) {
                return 29;
            } else {
                return 28;
            }
        default:
            return 31;
    }
}

关于参数的验证,如果您正在接收用户输入,则应该在用于计算的方法之外对所有参数进行验证(传递已经验证的方法输入,而不是直接在其中进行验证)。