Java月映射程序

Java Month Mapping Program

嘿伙计们,我应该写一个 Java 代码,能够将月份名称打印到相应的月份编号,反之亦然......如果输入无效,程序应该只打印一条错误信息。其他要求是 switch 语句和用于确定输入类型的静态 class 方法布尔值。不幸的是,我不知道如何确定数据类型以及如何对字符串使用 switch 语句......这就是我到目前为止所做的,它适用于第一部分:

import java.util.Scanner;

public class MonthMapping{

public static boolean isMonthNumber(String month) {

    int monthnumber = Integer.parseInt(month);

    if((monthnumber >= 1) && (monthnumber <= 12)) {
        return true;
    }

    else {
        return false;
    }
}

public static void main(String [] args){

    Scanner sc = new Scanner(System.in);


    System.out.print("Enter month:  ");
    int month = sc.nextInt();

    String monthString;

    switch (month) {
        case 1:  monthString = "January";
                 break;
        case 2:  monthString = "February";
                 break;
        case 3:  monthString = "March";
                 break;
        case 4:  monthString = "April";
                 break;
        case 5:  monthString = "May";
                 break;
        case 6:  monthString = "June";
                 break;
        case 7:  monthString = "July";
                 break;
        case 8:  monthString = "August";
                 break;
        case 9:  monthString = "September";
                 break;
        case 10: monthString = "October";
                 break;
        case 11: monthString = "November";
                 break;
        case 12: monthString = "December";
                 break;
        default: monthString = "Invalid month";
                 break;
    }

    System.out.println(monthString);

    }


}

有人可以给我第二部分的解决方案吗?或者至少有一些提示如何去做?

检查数据类型

您可以创建如下方法来检查输入类型:

public static boolean isString(Object input){
    try{
        String str = (String) input;
        return true;
    }catch(ClassCastException ex){
        return false;
    }
}

考虑以下情况:

输入:false,输出:(将返回 false)

输入:"January",输出:(返回true)

输入:43,输出:(将返回 false)

False 返回,因为转换不起作用,当抛出该异常时抛出 ClassCastException 它被 catch 子句捕获,该子句捕获 Exception 类型的异常及其各自的子类,这是为什么返回 false。

当 Class 转换成功时,与第二种情况一样返回 true。


带字符串的 Switch 语句

switch 语句的使用方式与您已经使用过的方式类似,但是数据类型已更改为...字符串,正如您所假设的那样。

switch(/*Enter String to be tested*/){

case /*String 1*/: //Logic if String to be tested is equal to logic 1.
                   //Optional break statements.
case /*String 2*/: //Logic if String to be tested is equal to logic 2.
                   //Optional break statements.
default: //Logic if the String to be tested is not equal to any of the case strings.

我知道你可能正在做作业或练习编码,就这样吧。但是您应该知道 java.time classes 中已经内置了这种确切的行为。

java.time.Month

在那些 classes 中是 Month enum,定义了十几个对象,一年中的每个月,1 月到 12 月,编号为 1-12。

获取特定月份 (1-12) 的 Month 对象。

Month month = Month.of( 2 );  // 2 → February.

换个方向,向 Month 对象询问其月份编号。

int monthNumber = Month.FEBRUARY.getValue();  // February → 2.

关于此 class 的许多其他便利方法,例如了解本月的 the number of days in each month. The class can even generate a localized name

此外,您应该在您的代码库周围传递此枚举的对象,而不仅仅是整数。这样做可以提供类型安全,确保值的有效范围,并使您的代码更加自文档化。如果不熟悉 Java.

中令人惊讶的强大枚举功能,请参阅 Oracle Tutorial

您可能还会发现 Year and YearMonth classes.

很有用

关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些 classes 取代了麻烦的旧 legacy 日期时间 classes,例如 java.util.Date, .Calendar, & java.text.SimpleDateFormat.

Joda-Time project, now in maintenance mode,建议迁移到java.time。

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

从哪里获得java.time classes?

  • Java SE 8 and SE 9 及更高版本
    • 内置。
    • 标准 Java API 的一部分,带有捆绑实施。
    • Java 9 添加了一些小功能和修复。
  • Java SE 6 and SE 7
  • Android
    • ThreeTenABP项目专门为Android改编了ThreeTen-Backport(上面提到的)。
    • 参见

ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.