我试图检查日期的有效性。我只能使用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;
}
答案 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");
}