2016-09-29 45 views
-3

我有以下代码使用Java中的字符串从switch语句

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,但我很好奇如何做以上的未来参考。

+0

为什么不把sysout语句放在你的switch case中 – mhasan

+2

在'case'块中声明变量有什么意义。它们将被限制在这些块的范围内(即在这些代码块之外不可见)。什么是dayFuture,哪里在定义中。为什么不做简单的int算术? –

+0

对不起,这是我第一次使用本网站。我试图把我的整个代码放在一起,但它没有很好的翻译,所以我把它剪掉了。 – NewProgrammerMR

回答

0

串联

在代码中拼接多个字符串时,将它们连接在一起。在Java中有多种方式来实现这一点。

+标志组合String对象。每个String对象是immutable,这意味着您不要更改(“mutate”)其值。相反,一个新的实例诞生了,将原始值和新添加的String对象组合在一起。

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

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

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

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

警告:使用StringBuilder只有在thread-safety是没有问题的。当您的Appendable对象可能通过多个线程访问时,请改为使用StringBuffer

有关各种与字符串有关的对象的详细信息,请参见my Answer,问题Exact difference between CharSequence and String in java

DayOfWeek

DayOfWeekenum拥有七项情况下,一个星期的每一天。获取今天的星期几意味着获得今天的日期,并且需要一个时区。对于任何特定的时刻,日期因地区而异。

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,并确保有效的值。

定义外开关块文本对象

在问题的代码的主要问题是,可变保持字符串被内部定义switchcase;在退出switchcase后,该变量超出了范围,并且在您有机会连接或打印文本内容之前立即成为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对象与AppendableStringBuilder

StringBuilder

串联时比弦数多,线程安全是不是在你的背景有问题,使用StringBuilder类。

请注意,我们定义了一个名为messageswitch街区StringBuilder对象。在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); 

如果绕过此经过的时间,使用TemporalAmountPeriodDuration对象,而不是单纯的整数。

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); 
+0

感谢您的解释,我没有意识到有多种方式来执行串联。至于未来的日子,这个问题要求我们输入日期和日期的值。 – NewProgrammerMR

+0

@NewProgrammerMR请参阅我添加的部分,*日期数学*。 –