【问题标题】:Java Using strings from within a switch statementJava 在 switch 语句中使用字符串
【发布时间】:2016-09-29 02:20:27
【问题描述】:

我有以下代码

    switch (dayCurrent) {
        case 0: 
                String today_sun = "Today is Sunday";
                break;
        case 1: 
                String today_mon = "Today is Monday";
                break;
        case 2: 
                String today_tues = "Today is Tuesday";
                break;
        case 3: 
                String today_wed = "Today is Wednesday";
                break;
        case 4: 
                String today_thurs = "Today is Thursday";
                break;
        case 5: 
                String today_fri = "Today is Friday";
                break;
        case 6: 
                String today_sat = "Today is Saturday";
                break;
        // If statement for invalid entry
        default: if (dayCurrent >= 7) {
            System.out.println("Invalid day entered");
        }
    }
    // Switch statements to display future day
    if (dayCurrent < 7) {
        switch (dayFinal) {
            case 0: 
                    String future_sun = dayFuture + " day(s) later it is Sunday";
                    break;
            case 1: 
                    String future_mon = dayFuture + " day(s) later is Monday";
                    break;
            case 2: 
                    String future_tues = dayFuture + " day(s) later is Tuesday";
                    break;
            case 3: 
                    String future_wed = dayFuture + " day(s) later is Wednesday";
                    break;
            case 4: 
                    String future_thurs = dayFuture + " day(s) later is Thursday";
                    break;
            case 5: 
                    String future_fri = dayFuture + " day(s) later is Friday";
                    break;
            case 6: 
                    String future_sat = dayFuture + " day(s) later is Saturday";
                    break;

如果我想创建一个 System.out.println 来显示两个开关的结果,我该怎么做呢? 我知道这段代码以前出现在这里:Java (Find the future date with if else statements),并且执行 System.out.print 会更容易,但我很好奇如何执行上述操作以供将来参考。

【问题讨论】:

  • 为什么不将 sysout 语句放在 switch 案例中
  • case 块中声明变量有什么意义。它们将被限制在这些块的范围内(即在这些代码块之外不可见)。什么是 dayFuture 以及在哪里定义。为什么不做简单的 int 算术?
  • 对不起,这是我第一次使用这个网站。我试着把我的整个代码都放进去,但翻译得不好,所以我把它删掉了。
  • 在 switch 语句之前声明 String today;String future; 并在 case 'blocks' 中分配这些变量。然后 System.out.println(today) future 在 switch 语句之后。

标签: java string switch-statement


【解决方案1】:

串联

在您的代码中拼凑多个字符串时,将它们连接起来。在 Java 中有多种方法可以做到这一点。

+ 符号结合了String 对象。每个String 对象都是immutable,这意味着您不要更改(“变异”)它的值。取而代之的是一个新的实例,它结合了原始值和新添加的 String 对象。

String message = "My name is ";
message = message + "Basil";
message = message + "."; 
System.out.println( message );  // My name is Basil.

另一种方法是在实现Appendable 接口的任何类的对象上调用append

StringBuilder 是适合您情况的 Appendable 实现。

StringBuilder message = new StringBuilder( "My name is " );
message.append( "Basil" );
message.append( "." ); 
System.out.println( message.toString() );  // My name is Basil.

警告:仅在thread-safety 不成问题的情况下使用StringBuilder。当您的Appendable 对象可能被多个线程访问时,请改用StringBuffer

有关各种与字符串相关的对象的更多信息,并带有一个漂亮的图表来理解它们,请参阅问题的my AnswerExact difference between CharSequence and String in java

DayOfWeek

DayOfWeek enum 拥有七个实例,一个用于一周中的每一天。获取今天的星期几意味着获取今天的日期,这需要一个时区。对于任何给定的时刻,日期在全球范围内因地区而异。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
DayOfWeek dow = DayOfWeek.from( today );  // `dow` is an *object*, not mere text like `Monday` or mere integer number like `1`.

使用此enum 的对象而不是仅仅使用整数来表示一周中的某一天,可以使您的代码更具自我记录性,提供type-safety,并确保有效值。

定义文本对象外部开关块

问题代码中的主要问题是保存字符串的变量定义在内部 switch case;该变量在退出switch case 时超出范围,并立即成为garbage collection 的候选对象(换句话说,您的字符串对象消失并被销毁,从内存中清除)在您有机会之前连接或打印您的文本内容。

所以这段代码:

switch (dayCurrent) {
    case 0: 
            String today_sun = "Today is Sunday";
            break;
    case 1: 
            String today_mon = "Today is Monday";
            break;
…

……应该是:

String today = null;

switch (dayCurrent) {
    case 0: 
            today = "Today is Sunday";
            break;
    case 1: 
            today = "Today is Monday";
            break;
…

但是,更好的是,我们可以将 String 对象替换为 Appendable: StringBuilder

StringBuilder

当连接多个字符串并且线程安全在您的上下文中不是问题时,请使用StringBuilder 类。

请注意,我们在switch 块之外定义了这个名为messageStringBuilder 对象。在switch 之外定义意味着对象在切换完成其工作之前、期间和之后仍然存在。

StringBuilder message = new StringBuilder();

switch ( dow ) {
    case DayOfWeek.MONDAY:
    case DayOfWeek.TUESDAY: 
    case DayOfWeek.WEDNESDAY: 
    case DayOfWeek.THURSDAY:  
    case DayOfWeek.FRIDAY: 
        message.append( "Weekday - Working for a living. " );
        break;

    case DayOfWeek.SATURDAY:
    case DayOfWeek.SUNDAY: 
        message.append( "Wohoo! Weekend… Party on Garth! " );
        break;

    default: 
        System.out.println("ERROR - Unexpectedly reached case DEFAULT on value for DayOfWeek 'dow'.");
    }

您的代码中的dayFuture 部分对我来说毫无意义,并且似乎与您将多个switch 块中的文本拼凑在一起的问题无关。所以我会用一个废话whatever开关。

switch ( whatever ) {
    case thisThing: 
        message.append( "Use vanilla." );
        break;

    case thatThing: 
        message.append( "Use chocolate." );
        break;

    case theOtherThing: 
        message.append( "Use almond." );
        break;

    default: 
        System.out.println("ERROR - Unexpectedly reached case DEFAULT on value for whatever.");
    }

现在我们已经建立了一个由多个组件组成的消息。我们可以将其输出到System.out

System.out.println( message.toString() ); // Outputs day-of-week text combined with flavor text.

工作日 - 以工作为生。使用巧克力。

日期数学

至于给一个日期加上天数来获得另一个日期,只需调用plus…minus… 方法即可。

如果用户输入一串数字,则解析为要添加的天数。

Integer days = Integer.valueOf( "4" );

添加该天数。

LocalDate future = today.plusDays( days );

如果绕过这个经过的时间,请使用TemporalAmount,例如PeriodDuration 对象,而不仅仅是整数。

Period period = Period.ofDays( days );
LocalDate future = today.plus( period );

要查看未来日期的星期几,请获取 DayOfWeek 枚举对象。无需开关。

DayOfWeek dow = DayOfWeek.from( future );

您可以向DayOfWeek 询问其本地化名称。致电DayOfWeek::getDisplayName。通过TextStyle 指定长度或缩写。并通过Locale 指定用于翻译的人类语言和用于决定标点符号和部分顺序等问题的文化规范。

String dowName = 
    dow.getDisplayName( 
        TextStyle.FULL_STANDALONE , 
        Locale.CANADA_FRENCH );

【讨论】:

  • 感谢您的解释,我没有意识到执行连接的方法不止一种。至于 dayFuture,问题要求我们输入天数和经过天数的值。
  • @NewProgrammerMR 请参阅我添加的部分,日期数学
猜你喜欢
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多