Ввод символа для выбора оператора переключения

Этот вопрос касается оператора switch. Это несколько похожих постов по этому поводу (ниже), но я все еще не понимаю.

Использование вводимых пользователем символов в операторах If / Switch

Как мне использовать символ в качестве футляра в корпусе переключателя?

Несколько символов в операторе переключения?

Обратите внимание на следующее:

public class main
{
    public int selection; 

    public main()
    {
        System.out.println("MENU");
        Scanner in = new Scanner(System.in);
        do {
            showMenu();
            selection = in.nextInt();
            switch (selection)
            {
                case 1:
                    doSomething();
                break;              
                case 2:
                case 3: 

                default: 
                    System.out.println("Instruction is invalid");
            }
        } 
        while (selection !=7);
        { System.exit(0); }
}

public static void showMenu() 
    {
        System.out.print('\u000c');
        System.out.println("option 1 \n");
        System.out.println("option 2 \n");            
        System.out.println("7 - exit.\n");
        System.out.println("Select Option:\n");
    }
}

Таким образом, это оператор switch, позволяющий пользователю выбирать параметры в цикле do while. Пользователь вводит целое число из распечатанного списка, чтобы выбрать вариант, после завершения дела он возвращается в меню.

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

public class main
    {
    public int selection; 

    public main()
    {
        System.out.println("MENU");
        Scanner in = new Scanner(System.in);
        do {
            showMenu();
            String menu = "";
            char selection = menu.charAt();          
            switch (selection)
            {
                case 'A':
                doSomething();
                break;                
                case 2, 3, 4, 5, 6
                default: 
                System.out.println("Instruction is invalid");
            }
        } 
        while (selection != 'QQ');
        { System.exit(0); }
}

Во второй опубликованной ссылке был ответ, который, как мне кажется, предлагал использовать hello.charAt (0) как условие переключения?

  switch (hello.charAt(0)) 
      {
          case 'a': ... break;
      }

У меня есть три конкретных вопроса по этому коду:

1) Мой код не работает. Должно ли мое условие быть hello.charAt (0)?

2) Я хотел бы использовать QQ в качестве опции выхода на переключателе. Возможно ли с кодом выше? По второй ссылке, думаю, должно быть хорошо.

3) Здесь также показано (Оператор переключения с использованием char в условии case?), что оператор case должен иметь двойные кавычки. Может ли кто-нибудь прояснить это?

Исправьте отступ.

Turing85 16.04.2018 16:00

где основной метод: public static void main(String[] args)?

Elarbi Mohamed Aymen 16.04.2018 16:02
while (selection != 'QQ') Это не сработает, потому что все, что находится в одинарных кавычках, является символьным литералом. QQ - это не отдельный символ - это строка.
Michael 16.04.2018 16:03

"Мой код не работает." - Что не работает? Пожалуйста, будьте точны. Определите ввод, а также ожидаемое и наблюдаемое поведение. «Я бы хотел использовать QQ ...» - Что вы подразумеваете под «QQ»? Строка "QQ"? Если так: нет, вам придется читать и переключать String, а не char. «[...] что оператор case должен иметь двойные кавычки.» - я рекомендую базовое руководство по Java. Тексты в кавычках " - это String, а отдельные символы в кавычках ' - это char.

Turing85 16.04.2018 16:05

Спасибо @ Turing85 за информацию. Я немного прочитал о цитатах. Я раньше не обращал на это внимания. Очень признателен.

kp-a 16.04.2018 17:37

Спасибо @Michael.

kp-a 16.04.2018 17:41
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
677
3

Ответы 3

Чтобы использовать .charAt (), вам необходимо указать индекс - поэтому, если вы хотите использовать первый символ, используйте 0 и т. д.

@ Turing85 Я почти уверен, что он ссылается на строку menu.charAt() с String menu = "".

L.Spillner 16.04.2018 16:03

Что-то вроде этого должно работать лучше:

do {
    showMenu();
    String menu = in.nextLine(); // read a line of input
    char selection;
    if (menu.length>0) selection = menu.charAt(0); // extract the first char of the line read
    else selection = '\0'; // special char when input is empty...

    switch (selection) {
    case 'A': case 'a':
         doSomething();
         break;
    case 'Q': case 'q':
         break;
    default: 
         System.out.println("Instruction is invalid");
    }
} while (selection != 'Q' && selection != 'q');

menu сохраняет полную строку ввода. selection будет первым символом (если он существует) строки.

небольшая оптимизация: if (menu.length>0) selection = menu.toLowerCase().charAt(0); - избавляется от прописных букв.

Turing85 16.04.2018 16:11

Спасибо вам обоим за ваши ответы. Оба отличные. Теперь я вижу, что этот оператор работает почти так же, как и для целых чисел. Этот код в нижнем / верхнем регистре действительно хорош.

kp-a 16.04.2018 17:36

@ Turing85 Верно, но я позволил так, потому что OP может захотеть различать случаи.

Jean-Baptiste Yunès 16.04.2018 17:42

Обычно читается целая строка вместо одного нажатия клавиши:

charAt(0) получает первый символ строки. Однако строка может иметь длину 0. Существует if-выражение CONDITION ? TRUEVALUE : FALSEVALUE.

    String menu = in.readLine();
    char selection = menu.isEmpty() ? ' ' : menu.charAt(0);
    switch (selection) {
        case 'A':
            doSomething();
            break;
        case '2':
        case '3':
        case '4':
            ...
            break;
        default: 
            System.out.println("Instruction is invalid");
    }

Есть еще более лаконичное решение:

    String menuSelection = in.readLine();
    switch (menuSelection) {
        case "A":
            doSomething();
            break;
        case "2":
        case "3":
        case "4":
            ...
            break;
        default: 
            System.out.println("Instruction is invalid");
    }

Мне нравится использование тернарного оператора. Могу ли я использовать это? char selection = menu.isEmpty() ? (System.out.println("invalid input"+selection)) : menu.charAt(0);

kp-a 16.04.2018 17:46

Собственно, комментарий неверный. Как вы сказали, первая часть? если условие истинно, вторая часть - если условие ложно. Переключив мой код, что-то вроде этого сработает? В случае, если пользователь ничего не вводит, я бы хотел уведомить пользователя.

kp-a 16.04.2018 17:54

Оставьте это для выражений, хотя это действительно if-then-else, с результатом, тип которого является общим для then-part и else-part.

Joop Eggen 17.04.2018 10:27

Другие вопросы по теме