Оператор Switch с использованием подстроки пользовательского ввода

Цель: Я пытаюсь вывести сообщение на основе ввода пользователя.

Ситуация: Обычно пользователь вводит несколько символов, например 5r (5 красных) или 8y (8 желтых). Ожидается, что сначала будет цифра, а затем символ, но возможно, что пользователь не следует этому правилу.

Я использовал операторы переключения (часть упражнения), но результат не дает мне того, что я ожидаю.

Код:

        String input = reader.nextLine().toLowerCase();
        String firstChar = input.substring(0,1);
        String secondChar = input.substring(1);
        String answer = "";

        switch(firstChar)
        {
            case "0":
            {
                switch(secondChar)
                {
                    case "b":
                        answer = "Zero Blue";
                    case "r":
                        answer = "Zero Red";
                    case "g":
                        answer = "Zero Green";
                    case "y":
                        answer = "Zero Yellow";
                }
            }
            case "1":
            {
                switch(secondChar)
                {
                    case "b":
                        answer = "One Blue";
                    case "r":
                        answer = "One Red";
                    case "g":
                        answer = "One Green";
                    case "y":
                        answer = "One Yellow";
                }
            }
           ... other case statements....
           default:
              answer = "not valid";

Когда пользователь пишет 0b, мой вывод должен быть «Нулевой синий», но в настоящее время отображается «недействительно». Почему?

Вы забыли добавить утверждения break; между каждым case.

markspace 27.05.2019 23:57

... @markspace, это было глупо. Спасибо. мне нужно ставить фигурные скобки для каждого оператора case, чтобы объединить разрыв и оператор?

Roger Steinberg 28.05.2019 00:01

Нет, вам не нужны фигурные скобки для операторов case, даже если внутри несколько элементов. Прочтите мои обновленные ответы для получения дополнительной информации об операторах switch, а также о работоспособном коде, использующем массивы.

Matthew 28.05.2019 00:21
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
601
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Как упоминалось в @markspace, вам не хватало оператора break. Вот небольшой отрывок из Java документация об операторах switch:

Each break statement terminates the enclosing switch statement. Control flow continues with the first statement following the switch block. The break statements are necessary because without them, statements in switch blocks fall through.

Также я рекомендую использовать специальный метод и циклы for для упрощения отладки.

Следующий код дает желаемый результат:

public static String getAnswer() {

        Scanner reader = new Scanner(System.in);
        String input = reader.nextLine().toLowerCase();
        String firstChar = input.substring(0, 1);
        String secondChar = input.substring(1);

        String[] chars = new String[] { "b", "r", "g", "y" };
        String[] answers1 = new String[] { "Zero Blue", "Zero Red", "Zero Green", "Zero Yellow" };
        String[] answers2 = new String[] { "One Blue", "One Red", "One Green", "One Yellow" };

        if ((firstChar.equals("0"))) {
            for (int i = 0; i < chars.length; i++) {
                if (secondChar.equals(chars[i])) {
                    return answers1[i];
                }
            }
        }
        else if ((firstChar.equals("1"))) {
            for (int i = 0; i < chars.length; i++) {
                if (secondChar.equals(chars[i])) {
                    return answers2[i];
                }
            }
        }
        return "not valid";
    }

    public static void main(String[] args) throws IOException {

        System.out.println(getAnswer());
    }

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

public enum Answer {

    BLUE('b',"Blue"), RED('r',"Red"),
    GREEN('g',"Green"), YELLOW('y',"Yellow");

    private static final String[] prefix = new String[] {"Zero", "One"};

    char letter;
    String name;

    Answer(char letter, String name) {
        this.letter = letter;
        this.name = name;
    }

    public static String getForInput(char input, int index) {

        if (index > prefix.length)
            return "value out of range " + index;

        for (Answer answer : Answer.values()) {
            if (input == answer.letter)
                return prefix[index] + " " + answer.name;
        }
        return "unable to find answer for input " + input;
    }
}

public static String getAnswer() {

    System.out.println("Enter your input: ");
    Scanner reader = new Scanner(System.in);
    String input = reader.nextLine().toLowerCase();
    int number = Integer.valueOf(input.substring(0, 1));
    char letter = input.substring(1).charAt(0);

    return Answer.getForInput(letter, number);

}

Я предлагаю вообще не использовать регистр переключателей, использовать хэш-карты:

package mypackage;

import java.util.*;

public class MyComputingClass {

    private static Map<Character, String> firstCharMapping;
    private static Map<Character, String> secondCharMapping;

    public static void main(String[] args) {
        initCharMappers();

        System.out.println("Mapping of 0Y : " + mapStuff("0Y"));
        System.out.println("Mapping of 0y : " + mapStuff("0y"));
        System.out.println("Mapping of 0YJ : " + mapStuff("0YJ"));
        System.out.println("Mapping of 2B : " + mapStuff("2B"));
        System.out.println("Mapping of eB : " + mapStuff("eB"));
    }

    private static void initCharMappers() {
        firstCharMapping = new HashMap<>();
        secondCharMapping = new TreeMap<>(Comparator.comparing(Character::toLowerCase));

        firstCharMapping.put('0', "Zero");
        firstCharMapping.put('1', "One");
        firstCharMapping.put('2', "Two");

        secondCharMapping.put('Y', "Yellow");
        secondCharMapping.put('B', "Blue");
        secondCharMapping.put('G', "Green");
    }

    private static String mapStuff(String str) {
        String INVALID_INPUT = "Invalid input";
        if (!str.matches("\\d[a-zA-Z]")) {
            return INVALID_INPUT;
        }

        Character firstChar = str.toCharArray()[0];
        Character secondChar = str.toCharArray()[1];

        if (!firstCharMapping.containsKey(firstChar) || !secondCharMapping.containsKey(secondChar)) {
            return INVALID_INPUT;
        }

        return firstCharMapping.get(firstChar) + " " + secondCharMapping.get(secondChar);
    }
}

Выход :

Mapping of 0Y : Zero Yellow
Mapping of 0y : Zero Yellow
Mapping of 0YJ : Invalid input
Mapping of 2B : Two Blue
Mapping of eB : Invalid input

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