Подтвердить что ты не робот

Использование двух значений для одного оператора case switch

В моем коде программа выполняет что-то в зависимости от введенного пользователем текста. Мой код выглядит так:

switch (name) {
        case text1: {
            //blah
            break;
        }
        case text2: {
            //blah
            break;
        }
        case text3: {
            //blah
            break;
        }
        case text4: {
            //blah
            break;
        }

Однако код внутри случаев text1 и text4 одинаковый. Поэтому я задавался вопросом, можно ли мне реализовать что-то вроде

case text1||text4: {
            //blah
            break;
        }

Я знаю, что оператор || не будет работать в аргументе case, но есть ли что-то подобное, которое я могу использовать.

4b9b3361

Ответ 1

Вы можете использовать оба оператора CASE следующим образом.

  case text1: 
  case text4:{
            //blah
            break;
        }

СМОТРЕТЬ ДАННЫЙ ПРИМЕР: пример кода вычисляет количество дней в конкретном месяце:

class SwitchDemo {
    public static void main(String[] args) {

        int month = 2;
        int year = 2000;
        int numDays = 0;

        switch (month) {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                numDays = 31;
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                numDays = 30;
                break;
            case 2:
                if (((year % 4 == 0) && 
                     !(year % 100 == 0))
                     || (year % 400 == 0))
                    numDays = 29;
                else
                    numDays = 28;
                break;
            default:
                System.out.println("Invalid month.");
                break;
        }
        System.out.println("Number of Days = "
                           + numDays);
    }
}

Это результат кода:

Number of Days = 29

проваливается:

Еще одна достопримечательность - оператор break. Каждый оператор break завершает оператор включения. Поток управления продолжается первый оператор, следующий за блоком коммутатора. Заявления о перерывах необходимы, потому что без них утверждения в блоках переключателей fall through: все операторы после соответствующего ярлыка case выполняются в последовательности, независимо от выражения последующих меток случая, пока не будет встречен оператор break.

ПРИМЕР КОД:

public class SwitchFallThrough {

    public static void main(String[] args) {
        java.util.ArrayList<String> futureMonths =
            new java.util.ArrayList<String>();

        int month = 8;

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

        if (futureMonths.isEmpty()) {
            System.out.println("Invalid month number");
        } else {
            for (String monthName : futureMonths) {
               System.out.println(monthName);
            }
        }
    }
}

Это результат кода:

August
September
October
November
December

Использование строк в операторах switch

В Java SE 7 и более поздних версиях вы можете использовать объект String в коммутаторе выражение выражения. Следующий пример кода, отображает номер месяца в зависимости от значения строки named month:

public class StringSwitchDemo {

    public static int getMonthNumber(String month) {

        int monthNumber = 0;

        if (month == null) {
            return monthNumber;
        }

        switch (month.toLowerCase()) {
            case "january":
                monthNumber = 1;
                break;
            case "february":
                monthNumber = 2;
                break;
            case "march":
                monthNumber = 3;
                break;
            case "april":
                monthNumber = 4;
                break;
            case "may":
                monthNumber = 5;
                break;
            case "june":
                monthNumber = 6;
                break;
            case "july":
                monthNumber = 7;
                break;
            case "august":
                monthNumber = 8;
                break;
            case "september":
                monthNumber = 9;
                break;
            case "october":
                monthNumber = 10;
                break;
            case "november":
                monthNumber = 11;
                break;
            case "december":
                monthNumber = 12;
                break;
            default: 
                monthNumber = 0;
                break;
        }

        return monthNumber;
    }

    public static void main(String[] args) {

        String month = "August";

        int returnedMonthNumber =
            StringSwitchDemo.getMonthNumber(month);

        if (returnedMonthNumber == 0) {
            System.out.println("Invalid month");
        } else {
            System.out.println(returnedMonthNumber);
        }
    }
}

Выход из этого кода равен 8.

FROM Java Docs

Ответ 2

вы можете сделать так:

case text1:
case text4: {
            //blah
            break;
}

Ответ 3

Значения case - это просто безконечные точки "goto", которые могут использовать одну и ту же точку входа:

case text1:
case text4: 
    //blah
    break;

Обратите внимание, что скобки являются избыточными.

Ответ 4

Просто сделай

case text1: case text4: 
     do stuff;
     break;

Ответ 5

Ответы fallthrough других хороши.

Однако другой подход будет заключаться в извлечении методов из содержимого ваших операторов case, а затем просто вызовите соответствующий метод из каждого случая.

В приведенном ниже примере оба случая "text1" и case "text4" ведут себя одинаково:

switch (name) {
        case text1: {
            method1();
            break;
        }
        case text2: {
            method2();
            break;
        }
        case text3: {
            method3();
            break;
        }
        case text4: {
            method1();
            break;
        }

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

Ответ 6

Скобки не нужны. Просто сделайте

case text1:
case text4:
  doSomethingHere();
  break;
case text2:
  doSomethingElse()
  break;

Если кому-то интересно, это называется провалом дела. Способность сделать это - причина, по которой break; необходимо для завершения операторов case. Для получения дополнительной информации см. Статью wikipedia http://en.wikipedia.org/wiki/Switch_statement.

Ответ 7

Падение подхода - это лучшее, что я чувствую.

case text1:
case text4: {
        //Yada yada
        break;
} 

Ответ 8

Значения case - это просто кодологические точки "goto", которые могут использовать одну и ту же точку входа:

case text1:
case text4: {
   // Сделайте что-нибудь
   break;
}

Обратите внимание, что скобки являются избыточными.

Ответ 9

С интеграцией JEP 325: Switch Expressions (Preview) в ранних версиях доступа JDK-12 теперь можно использовать новую форму метки коммутатора как: -

case text1, text4 -> {
     //blah
} 

или перефразировать демо из одного из ответов, что-то вроде: -

public class RephraseDemo {

    public static void main(String[] args) {
        int month = 9;
        int year = 2018;
        int numDays = 0;

        switch (month) {
            case 1, 3, 5, 7, 8, 10, 12 ->{
                numDays = 31;
            }
            case 4, 6, 9, 11 ->{
                numDays = 30;
            }
            case 2 ->{
                if (((year % 4 == 0) &&
                        !(year % 100 == 0))
                        || (year % 400 == 0))
                    numDays = 29;
                else
                    numDays = 28;
            }
            default ->{
                System.out.println("Invalid month.");

            }
        }
        System.out.println("Number of Days = " + numDays);
    }
}

Ответ 10

Ты можешь использовать:

case text1: case text4: 
     do stuff;
     break;

Ответ 11

Простейший трюк - использовать тот же метод в обоих случаях.

 switch (name) 
{
case text1: 
{
method1();
break;
}
case text2: 
{
method2();
break;
}
case text3:
{
method3();
break;
}
case text4: 
{
method1();
break;
}
}

private void method1()
{
//do the logic which is same
}