Нужно вернуть правильное значение номера по стандарту. Java работа со Strings. Уже много вариантов попробовал, вот последний из них

Основная часть гос регистрационного номера состоит из 6 символов: 3-ех букв и 3-ех цифр. Сначала идет буква, потом три цифры. Можно использовать любые цифры от 0 до 9, в качестве букв только следующие символы: A,B,C,E,H,K,M,O,P,T,X,Y. Например A304BT - правильный номер, а M134UO и CBA230 - нет. Ваше задание определить какие из номеров отвечают стандарту, а какие нет. Функция принимает ряд - автомобильный номер. Функция возвращает 100, если номер правильный, или количество букв в номере, если он не отвечает стандарту.

static int resolve(String line) {

    String ours = "";
    char[] chars = {'A', 'B', 'C', 'E', 'H', 'K', 'M', 'O', 'P', 'T', 'X', 'Y'};
    char[] numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    if (line.equals(ours)) {
        for (int i = 0; i < chars.length; i++) {
            for (int j = 0; j < numbers.length; j++) {
                for (int k = 0; k < 7; k++) {
                   
                }
            }
        }
        return 100;
    } else {
        return line.length();
    }
}

public static void main(String[] args) {
    System.out.println(resolve("P204BT"));
}

Ответы (1 шт):

Автор решения: Дмитрий

У вас слишком высокая вложенность : три вложенных цикла в условном операторе. Старайтесь от такого избавляться. Во-первых, это делает код достаточно тяжелым для понимания, во-вторых, вы можете получит проблемы с производительностью (на каждую 1 итерацию внешнего цикла приходится перебирать все элементы второго, а у вас еще есть третий). Кроме того, я не совсем понял условия: для некорректного нужно вернуть количество букв в номере, но при этом ваш код возвращает длину строки (return line.length()). Полагаю, что в коде ошибка, поэтому исхожу из описанного условия. Решение примерно такое:

import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Program {
    
    private final static Set<Character> CORRECT_LETERS = Stream.of('A','B','C','E','H','K','M','O','P','T','X','Y').collect(Collectors.toSet());
    
    public static int resolve(String line) {
        if (line==null) return 0;
        int letterNumber = 0;
        boolean isCorrectNumber = line.length()==6;
        char[] charArray = line.toCharArray();
        for (int i = 0; i < charArray.length; i++) {            
            if (Character.isLetter(charArray[i])) letterNumber++;
            isCorrectNumber = check(i, charArray[i], isCorrectNumber);
        }
        return isCorrectNumber ? 100 : letterNumber;
    }
    
    private static boolean check(int i, char ch, boolean isCorrectNumber) {
        if (!isCorrectNumber) return isCorrectNumber;
        return (i==0||i==4||i==5) ? CORRECT_LETERS.contains(ch) : Character.isDigit(ch);
    }

    public static void main(String[] args) {
        System.out.println(resolve("A304BT"));
        System.out.println(resolve("M134UO"));
        System.out.println(resolve("CBA230"));
    }
}
→ Ссылка