Этот вопрос касается оператора 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 должен иметь двойные кавычки. Может ли кто-нибудь прояснить это?
где основной метод: public static void main(String[] args)?
while (selection != 'QQ') Это не сработает, потому что все, что находится в одинарных кавычках, является символьным литералом. QQ - это не отдельный символ - это строка.
"Мой код не работает." - Что не работает? Пожалуйста, будьте точны. Определите ввод, а также ожидаемое и наблюдаемое поведение. «Я бы хотел использовать QQ ...» - Что вы подразумеваете под «QQ»? Строка "QQ"? Если так: нет, вам придется читать и переключать String, а не char. «[...] что оператор case должен иметь двойные кавычки.» - я рекомендую базовое руководство по Java. Тексты в кавычках " - это String, а отдельные символы в кавычках ' - это char.
Спасибо @ Turing85 за информацию. Я немного прочитал о цитатах. Я раньше не обращал на это внимания. Очень признателен.
Спасибо @Michael.




Чтобы использовать .charAt (), вам необходимо указать индекс - поэтому, если вы хотите использовать первый символ, используйте 0 и т. д.
@ Turing85 Я почти уверен, что он ссылается на строку menu.charAt() с String menu = "".
Что-то вроде этого должно работать лучше:
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 Верно, но я позволил так, потому что OP может захотеть различать случаи.
Обычно читается целая строка вместо одного нажатия клавиши:
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);
Собственно, комментарий неверный. Как вы сказали, первая часть? если условие истинно, вторая часть - если условие ложно. Переключив мой код, что-то вроде этого сработает? В случае, если пользователь ничего не вводит, я бы хотел уведомить пользователя.
Оставьте это для выражений, хотя это действительно if-then-else, с результатом, тип которого является общим для then-part и else-part.
Исправьте отступ.