Я пытаюсь написать код, который позволит мне проверить, является ли элемент, введенный пользователем, действительным. Элемент имеет формат: 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;
}
}
Код на самом деле не работает, и я понятия не имею, как действовать дальше. Кроме того, как мне убедиться, что если пользователь вводит более шести цифр в конце, код также будет считаться недействительным.
вы также можете использовать более краткие операторы if. т.е. если я <= 2 использовать isDigit(), если я == 3 || я == 6 проверить на "-". Пожалуйста, используйте переменную int i вместо того, чтобы вручную записывать каждый регистр от 0, 1, 2, 3 до любого значения.
также ДОЛЖНЫ ли вы использовать строковый буфер? Я могу понять использование строкового буфера для создания строки, но почему вы не можете использовать логическую переменную для проверки правильности? если строка действительна, вернуть true, если нет, вернуть false
Вот почему существуют регулярные выражения. userInput.matches(yourRegex)




вот очищенная версия вашего кода, хотя и не полная. Вы можете следовать стилю кода, чтобы завершить остальную логику.
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 {
}
}
}
}
Используя ваш ответ, я смог увидеть, что я делаю неправильно, и с помощью вашей логики мой код заработал! Большое спасибо за помощь!
Я предлагаю вам попробовать разделить 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, если второй "-" отсутствует.
Ты прав. В этом случае жесткий код каждого символа будет лучшим решением, как и ваш ответ.
вы можете вычислить допустимый диапазон длины строки, т.е. если len больше 8 и меньше 13. пластина действительна по длине. После этого проверьте форматирование строки