2016-09-29 5 views
-3

я следующий кодJava Использование строк внутри коммутатора заявления

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 в свои шкафы-переключатели – mhasan

+2

Какова точка объявления переменных в блоках 'case'. Они будут ограничены по охвату этими блоками (т. Е. Не видны вне этих блоков кода). Что такое dayFuture и где определено. Почему бы не сделать простые арифметические операции? –

+0

Извините, это мой первый раз, используя этот сайт. Я попытался вставить весь свой код, и он не переводил хорошо, поэтому я отключил его. – NewProgrammerMR

ответ

0

Concatenation

При склеивании нескольких строк через код, сцепить их. В Java существует несколько способов сделать это.

Знак + объединяет String объектов. Каждый объект String является immutable, что означает, что вы не должны изменять («мутировать») его значение. Вместо этого создается новый экземпляр, объединяющий исходное значение и вновь добавленный объект 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 объект с Appendable: StringBuilder.

StringBuilder

Когда конкатенации больше, чем несколько строк, и безопасности потоков не является проблемой в вашем контексте, используйте StringBuilder класс.

Обратите внимание, что мы определяем этот StringBuilder объект с именем messageвнеswitch блока. Определение за пределами 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 такие как Period или Duration объект, а не просто целым числом.

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

Спасибо за объяснение, я не понимал, что было несколько способов выполнить конкатенацию. Что касается dayFuture, вопрос просит нас ввести значение для обоих дней и дней. – NewProgrammerMR

+0

@NewProgrammerMR См. Раздел, который я добавил, * Дата математика *. –

Смежные вопросы