我目前正在从一本书中学习java,一个项目是在输入月份数后输出一个月的日期和月份名称。我想知道是否有更好的方法来设置我的if语句而不是我已经完成的事情。
PS:控制台阅读器只是一个包含的类,可以轻松地从用户控制台获取输入。
public class Project13 {
public static void main(String[] args) {
ConsoleReader console = new ConsoleReader(System.in);
System.out.println("Enter a month you would like to evaluate (by number):");
int month = console.readInt();
int days = 0;
String monthout = "Month";
String out = "Yes";
if(month == 1){
days = 31;
monthout = "January";
out = "There are " + days + " days in " + monthout;
}else if(month == 2){
System.out.println("Is it a leap year? Yes or No:");
String leap = console.readLine();
if(leap.equalsIgnoreCase("yes")){
days = 29;
monthout = "February";
out = "There are " + days + " days in " + monthout;
}else if(leap.equalsIgnoreCase("no")){
days = 28;
monthout = "February";
out = "There are " + days + " days in " + monthout;
}else{
out = "Something went wrong, please try again";
}
}else if(month == 3){
days = 31;
monthout = "March";
out = "There are " + days + " days in " + monthout;
}else if(month == 4){
days = 30;
monthout= "April";
out = "There are " + days + " days in " + monthout;
}else if(month == 5){
days = 31;
monthout = "May";
out = "There are " + days + " days in " + monthout;
}else if(month == 6){
days = 30;
monthout = "June";
out = "There are " + days + " days in " + monthout;
}else if(month == 7){
days = 31;
monthout = "July";
out = "There are " + days + " days in " + monthout;
}else if(month == 8){
days = 31;
monthout = "August";
out = "There are " + days + " days in " + monthout;
}else if(month == 9){
days = 30;
monthout = "September";
out = "There are " + days + " days in " + monthout;
}else if(month == 10){
days = 31;
monthout = "October";
out = "There are " + days + " days in " + monthout;
}else if(month == 11){
days = 30;
monthout = "November";
out = "There are " + days + " days in " + monthout;
}else if(month == 12){
days = 31;
monthout = "December";
out = "There are " + days + " days in " + monthout;
}else if(month > 12){
out = "Your month input was not valid. Please try again.";
}
System.out.println(out);
}
}
答案 0 :(得分:9)
你几乎可以用一对这样的数组替换整个if
语句:
int dayCount[] = new int[] {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
String monthName[] = new String[] {"January", "February", ...};
掌握这两个数组后,您可以这样做:
// February is the only month that needs special handling
if (month == 2) {
// Do your special handling of leap year etc...
} else if (month >= 1 && month <= 12) {
// All other valid months go here. Since Java arrays are zero-based,
// we subtract 1 from the month number
days = dayCount[month-1];
monthout = monthName[month-1];
} else {
// Put handling of invalid month here
}
out = "There are " + days + " days in " + monthout;
答案 1 :(得分:5)
switch(month) {
case 1:
// stuff
break;
case 2:
// etc.....
如果你要这样做,你绝对应该使用enum
而不仅仅是代表几个月的整数......
答案 2 :(得分:0)
您可以使用switch-case
语句。避免使用if-else
switch(month) {
case 1:
days = 31;
monthout = "January";
out = "There are " + days + " days in " + monthout;
break;
case 2:
// Add stuff
break;
default:
break;
}
答案 3 :(得分:0)
开关:
switch (month)
{
case 1:
// ... stuff here
break;
case 2:
// ... stuff here
break;
// ... more cases
default: // no case above matched what the month was
// .... handle default case
};
答案 4 :(得分:0)
使用switch语句而不是其他许多if-if。它更容易阅读,修改和中断工作比否则更快 - 如果
case 1:
//code
break;
答案 5 :(得分:0)
我认为你应该使用Map
来避免所有这些if(或转换)情况。你的代码的主要问题是你需要复制很多代码。
private static Map<Integer, Integer> monthDays = new HashMap<>();
static {
monthDays.put(1, 31);
monthDays.put(2, 28);
...
}
private static int getMonthDays(int month) {
if (month == 2) {
// handle special case with Februar
}
return monthDays.get(month);
}
public static void main(String[] args) {
...
if (month >= 1 && month <= 12) {
monthout = getMonthDays(month);
...
out = "There are " + days + " days in " + monthout;
} else {
out = "Your month input was not valid. Please try again.";
}
System.out.println(out);
}
答案 6 :(得分:0)
switch-case并不是更好。如果有超过3-4个if-else或switch条件,请考虑使用其他方式执行此操作,如命令或策略模式等。
例如,创建一个动作地图,如果条件设置并执行您想要的操作。示例代码如下。这只是示例代码让我知道,以防您需要进一步详细说明任何部分:
public void initMap(){
Map<Integer, MonthData> monthDataMap = new HashMap<Integer,MonthData>();
monthDataMap.put(1,new JanData());
monthDataMap.put(2,new FebData());
}
interface MonthData {
public String getMonth();
public int getDays();
public String getOut();
}
class JanData implements MonthData{
private String month ="January";
private int days = 30;
private String out = "There are " + days + " days in " + month;
@Override
public String getMonth() {
return month;
}
@Override
public int getDays() {
return days;
}
@Override
public String getOut() {
return out;
}
}
class FebData {
private String month ="February";
private int days = 28;
private String out = "There are " + days + " days in " + month;
}
....