2016-09-29 53 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請參閱我添加的部分,*日期數學*。 –