Как проверить, был ли введен пользователем правильный символ в строке в java?

Я пытаюсь написать код, который позволит мне проверить, является ли элемент, введенный пользователем, действительным. Элемент имеет формат: NNN-LL-NNNNNN, где N — число, а L — буква.

Мой код должен уметь определять, действителен ли элемент, проверяя все символы в строке, поэтому, если, например, пользователь вводит «222-DN-1055», он действителен, но если это «2-DN-1055», тогда он не является.

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

Теперь это код, который я сделал до сих пор:

public class ItemChecker{

    //vars
    private String userInput;
    private StringBuffer strBuff;
    private String validity;

    //constructor
    public ItemChecker(){
            strBuff=new StringBuffer();
    }

    //set
    public void setUserInput(String userInput){
            this.userInput=userInput;
    }

    //compute
    public void computeValidity(){
        for(int i=0;i<userInput.length();i++){
            if (Character.isDigit(userInput.charAt(0))){
                strBuff.append(userInput.charAt(0));
            }
            else if (Character.isDigit(userInput.charAt(1))){
                strBuff.append(userInput.charAt(1));
                }
            else if (Character.isDigit(userInput.charAt(2))){
                strBuff.append(userInput.charAt(2));
                }
            else if (userInput.charAt(3)=='-'){
                strBuff.append(userInput.charAt(3));
                }
            else if (Character.isLetter(userInput.charAt(4))){
                strBuff.append(userInput.charAt(4));
                }
            else if (userInput.charAt(4) == 'c' || userInput.charAt(i) == 'd'|| userInput.charAt(i) == 'g' || userInput.charAt(i) == 'k' || userInput.charAt(i) == 'l' || userInput.charAt(i) == 'm'|| userInput.charAt(i) == 'o'|| userInput.charAt(i) == 'r' || userInput.charAt(i) == 's' || userInput.charAt(i) == 't' || userInput.charAt(i) == 'w'){
                strBuff.append(userInput.charAt(4));
                }
            else if (Character.isLetter(userInput.charAt(5))){
                strBuff.append(userInput.charAt(5));
                }
            else if (userInput.charAt(5) == 'k' || userInput.charAt(i) == 'e' || userInput.charAt(i) == 'n' || userInput.charAt(i) == 'w' || userInput.charAt(i) == 'l' || userInput.charAt(i) == 'y' || userInput.charAt(i) == 'd'|| userInput.charAt(i) == 'h' || userInput.charAt(i) == 'm' || userInput.charAt(i) == 's' || userInput.charAt(i) == 'o' || userInput.charAt(i) == 'x'){
                strBuff.append(userInput.charAt(5));
                }
            else if (userInput.charAt(6)=='-'){
                strBuff.append(userInput.charAt(6));
                }
            else if (Character.isDigit(userInput.charAt(7))){
                strBuff.append(userInput.charAt(7));
                }
            else if (Character.isDigit(userInput.charAt(8))){
                strBuff.append(userInput.charAt(8));
                }
            else if (Character.isDigit(userInput.charAt(9))){
                strBuff.append(userInput.charAt(9));
                }
            else if (Character.isDigit(userInput.charAt(10))){
                strBuff.append(userInput.charAt(10));
                }
            else if (Character.isDigit(userInput.charAt(11))){
                strBuff.append(userInput.charAt(11));
                }
            else if (Character.isDigit(userInput.charAt(12))){
                strBuff.append(userInput.charAt(12));
            }
            else{
                strBuff.append("Your registration plate is not valid.");
            }
            }

        validity=strBuff.toString();
    }

    //get
    public String getValidity(){
            return validity;
    }
}

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

вы можете вычислить допустимый диапазон длины строки, т.е. если len больше 8 и меньше 13. пластина действительна по длине. После этого проверьте форматирование строки

experiment unit 1998X 14.05.2022 03:36

вы также можете использовать более краткие операторы if. т.е. если я <= 2 использовать isDigit(), если я == 3 || я == 6 проверить на "-". Пожалуйста, используйте переменную int i вместо того, чтобы вручную записывать каждый регистр от 0, 1, 2, 3 до любого значения.

experiment unit 1998X 14.05.2022 03:44

также ДОЛЖНЫ ли вы использовать строковый буфер? Я могу понять использование строкового буфера для создания строки, но почему вы не можете использовать логическую переменную для проверки правильности? если строка действительна, вернуть true, если нет, вернуть false

experiment unit 1998X 14.05.2022 03:47

Вот почему существуют регулярные выражения. userInput.matches(yourRegex)

H3AR7B3A7 14.05.2022 03:55
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
69
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

public void computeValidity(){
        if (userInput.length() < 8 && userInput.length()> 13){
            //if length is not in between 8 to 13
            return; //exits function
        }
        for(int i=0;i<userInput.length();i++) {
            char c = userInput.charAt(i);
            if (i <= 2) {
                if (Character.isDigit(c)) {
                    //do whatever for true
                } else {
                    //return false etc
                }
            } else if (i == 3 || i == 6) {
                if (c == '-') {
                    //do whatever for true
                } else {
                    //return false etc
                }
            } else if (i <= 5) {
                //check for county identifiers
            } else {
                //finally check for digits
                if (Character.isDigit(c)) {

                } else {

                }
            }
        }
    }

Используя ваш ответ, я смог увидеть, что я делаю неправильно, и с помощью вашей логики мой код заработал! Большое спасибо за помощь!

Narika 14.05.2022 10:32

Я предлагаю вам попробовать разделить userInput. Решайте проблему по частям.

Я использую Scanner для этого примера

    Scanner scan = new Scanner(System.in);
    String userInputPlate; 

    while (true) {
        userInputPlate = scan.nextLine();

        if (userInputPlate.equalsIgnoreCase("end")) {
            break;
        }

        // add the condition for 'SSSSSS'
        // i.e. > 8 
        // I omit it for readability
        if (userInputPlate.length() <= 13) {
            System.out.println("Please try again");
        }
    }
        String[] plateParts = userInputPlate.split("-");

        String YYY = plateParts[0];
        String LL = plateParts[1];
        String SSSSSS = plateParts[2];

        // notice I use "!" in if statement
        for (int i = 0; i < YYY.length(); i++){
            char[] YYYchar = YYY.toCharArray();
            if (!Character.isDigit((YYYchar[i]))){
                return;
            }
        }

        // for loop for LL, I skip it

        // do the same SSSSSS
        for (int i = 0; i < SSSSSS.length(); i++){
            char[] SSSSSSchar = SSSSSS.toCharArray();
                if (!Character.isDigit(SSSSSSchar[i])){
                    return;
                }
            }
        }

Таким образом, вы не только облегчите отладку каждого сегмента, но и улучшите читаемость.

Надеюсь, что это работает для вас.

это может вызвать ошибку IndexOutofBounds, если второй "-" отсутствует.

experiment unit 1998X 14.05.2022 04:46

Ты прав. В этом случае жесткий код каждого символа будет лучшим решением, как и ваш ответ.

yrred 14.05.2022 09:57

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