将多个 if-else 语句格式化为方法
Format multiple if-else statements into methods
我有一个程序可以检查用户日期输入并显示下一个日期的输出。但是,我在程序中使用了多个 if-else 语句。
我想修改它,让它使用方法来进行计算,而不是重复的代码。
下面是我的代码示例,以三月和四月为例,一个是 30 天,一个是 31 天:
public class calDate{
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
boolean dateValid = false;
int day = 0;
int month = 0;
int year = 0;
int nextDay = 0
int nextYear = 0;
String nextMonth = "";
boolean run=true;
char again='Y';
while(run)
{
System.out.print("Day: ");
day = scan.nextInt();
System.out.print("Month: ");
month = scan.nextInt();
System.out.print("Year: ");
year = scan.nextInt();
while (month < 1 && month > 12) //check if month is within 1 to 12
{
dateValid = false;
}
if ((month == 3) && (day >= 1 && day <= 31))
{
dateValid = true;
nextDay = day + 1;
nextMonth = " March ";
nextYear = year;
if (day == 31) {
nextDay = 1;
nextMonth = " April ";
nextYear = year;
}
}
else if ((month == 4) && (day >= 1 && day <= 30))
{
dateValid = true;
nextDay = day + 1;
nextMonth = " April ";
nextYear = year;
if (day == 30)
{
nextDay = 1;
nextMonth = " May ";
nextYear = year;
}
}
if (dateValid){
System.out.println("Tomorrow's date: " + nextDay + nextMonth + nextYear);
System.out.print("Continue?(Y/N) ");
again = scan.next().charAt(0);
if (again=='Y')
{
run=true;
System.out.println("");
}
if (again=='N')
{
run=false;
}
if ((again != 'N')&&(again!='Y'))
{
System.out.println("Invalid input. Ending program.");
run=false;
}
}
else{
System.out.println("Invalid input. Continue?(Y/N) ");
again = scan.next().charAt(0);
if (again=='Y')
{
run=true;
System.out.println("");
}
if (again=='N')
{
run=false;
}
if ((again != 'N')&&(again!='Y'))
{
System.out.println("Invalid input. Ending program.");
run=false;
}
}
}
有很多重复值,例如dateValid
、nextDay
、nextMonth
、nextYear
。我如何格式化我的代码,以便我可以将语句放入单独的方法中?谢谢。
我建议您使用给定的输入值构建一个字符串,使用 SimpleDateFormat 解析生成的字符串,然后捕获 ParseException 以更新您的 dateValid 布尔值。
这样您也可以更轻松地添加一天。
我建议您使用像 int[] daysInTheMonth = { 31. 28, ...
和 String[] monthName = ",Jan,Feb,Mar".split(",");
这样的数组,即使您处理所有月份,在代码中使用数据也会比现在短得多。
包含一个 isLeapYear(year)
方法会很有用。
出于测试目的,我建议您确保获得与 JSR-310 库相同的结果。虽然我假设您不能直接使用此库,但您可以使用它来测试您的代码是否正确。
我可能会创建方法 getNextDay()
、getMonthForNextDay()
和 getYearForNextDay()
。他们会将用户输入作为参数,并分别简单地 return 正确的日、月和年。您也可以将其与 Peter Lawreys 的回答结合起来。
我的第一个建议是将月份变成一个枚举。这样你就可以将所有与月份相关的逻辑封装在一个 class 中:
enum Month {
JAN ("Jan", 31),
FEB ("Feb", 28),
....
DEC ("Dec", 31);
private final String monthName;
private final int daysInMonth;
private Month(String monthName, int daysInMonth) {
this.monthName = monthName;
this.daysInMonth = daysInMonth;
}
public String getName() {
return monthName;
}
public static Month monthWithNumber(int monthNumber) {
if (monthNumber < 1 || monthNumber > 12)
throw new IllegalArgumentException();
return values()[monthNumber - 1];
}
public isLegalDay(int day) {
return day > 0 && day <= daysInMonth;
}
public isLastDayInMonth(int day) {
return day == daysInMonth;
}
public Month nextMonth() {
return values[(ordinal() + 1) % 12];
}
}
这会立即删除您的大部分 if
语句并将它们替换为:
Month month = Month.monthWithNumber(monthNumber);
if (month.isLegalDay(dayNumber)) {
....
if (month.isLastDayInMonth(dayNumber)) {
nextMonth = month.nextMonth().getName();
nextDay = 0;
}
}
我有一个程序可以检查用户日期输入并显示下一个日期的输出。但是,我在程序中使用了多个 if-else 语句。
我想修改它,让它使用方法来进行计算,而不是重复的代码。
下面是我的代码示例,以三月和四月为例,一个是 30 天,一个是 31 天:
public class calDate{
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
boolean dateValid = false;
int day = 0;
int month = 0;
int year = 0;
int nextDay = 0
int nextYear = 0;
String nextMonth = "";
boolean run=true;
char again='Y';
while(run)
{
System.out.print("Day: ");
day = scan.nextInt();
System.out.print("Month: ");
month = scan.nextInt();
System.out.print("Year: ");
year = scan.nextInt();
while (month < 1 && month > 12) //check if month is within 1 to 12
{
dateValid = false;
}
if ((month == 3) && (day >= 1 && day <= 31))
{
dateValid = true;
nextDay = day + 1;
nextMonth = " March ";
nextYear = year;
if (day == 31) {
nextDay = 1;
nextMonth = " April ";
nextYear = year;
}
}
else if ((month == 4) && (day >= 1 && day <= 30))
{
dateValid = true;
nextDay = day + 1;
nextMonth = " April ";
nextYear = year;
if (day == 30)
{
nextDay = 1;
nextMonth = " May ";
nextYear = year;
}
}
if (dateValid){
System.out.println("Tomorrow's date: " + nextDay + nextMonth + nextYear);
System.out.print("Continue?(Y/N) ");
again = scan.next().charAt(0);
if (again=='Y')
{
run=true;
System.out.println("");
}
if (again=='N')
{
run=false;
}
if ((again != 'N')&&(again!='Y'))
{
System.out.println("Invalid input. Ending program.");
run=false;
}
}
else{
System.out.println("Invalid input. Continue?(Y/N) ");
again = scan.next().charAt(0);
if (again=='Y')
{
run=true;
System.out.println("");
}
if (again=='N')
{
run=false;
}
if ((again != 'N')&&(again!='Y'))
{
System.out.println("Invalid input. Ending program.");
run=false;
}
}
}
有很多重复值,例如dateValid
、nextDay
、nextMonth
、nextYear
。我如何格式化我的代码,以便我可以将语句放入单独的方法中?谢谢。
我建议您使用给定的输入值构建一个字符串,使用 SimpleDateFormat 解析生成的字符串,然后捕获 ParseException 以更新您的 dateValid 布尔值。
这样您也可以更轻松地添加一天。
我建议您使用像 int[] daysInTheMonth = { 31. 28, ...
和 String[] monthName = ",Jan,Feb,Mar".split(",");
这样的数组,即使您处理所有月份,在代码中使用数据也会比现在短得多。
包含一个 isLeapYear(year)
方法会很有用。
出于测试目的,我建议您确保获得与 JSR-310 库相同的结果。虽然我假设您不能直接使用此库,但您可以使用它来测试您的代码是否正确。
我可能会创建方法 getNextDay()
、getMonthForNextDay()
和 getYearForNextDay()
。他们会将用户输入作为参数,并分别简单地 return 正确的日、月和年。您也可以将其与 Peter Lawreys 的回答结合起来。
我的第一个建议是将月份变成一个枚举。这样你就可以将所有与月份相关的逻辑封装在一个 class 中:
enum Month {
JAN ("Jan", 31),
FEB ("Feb", 28),
....
DEC ("Dec", 31);
private final String monthName;
private final int daysInMonth;
private Month(String monthName, int daysInMonth) {
this.monthName = monthName;
this.daysInMonth = daysInMonth;
}
public String getName() {
return monthName;
}
public static Month monthWithNumber(int monthNumber) {
if (monthNumber < 1 || monthNumber > 12)
throw new IllegalArgumentException();
return values()[monthNumber - 1];
}
public isLegalDay(int day) {
return day > 0 && day <= daysInMonth;
}
public isLastDayInMonth(int day) {
return day == daysInMonth;
}
public Month nextMonth() {
return values[(ordinal() + 1) % 12];
}
}
这会立即删除您的大部分 if
语句并将它们替换为:
Month month = Month.monthWithNumber(monthNumber);
if (month.isLegalDay(dayNumber)) {
....
if (month.isLastDayInMonth(dayNumber)) {
nextMonth = month.nextMonth().getName();
nextDay = 0;
}
}