#java #while-loop
#java #цикл while
Вопрос:
Я написал этот код для своего проекта курса Java, который получает номер телефона в 1800 БУКВАХ и выводит номер как 1-800-538-8377. То, с чем я борюсь, заключается в том, что я хочу продолжать запрашивать, пока пользователь не введет номер телефона в правильном формате (1800 БУКВ). Я знаю, что я должен использовать цикл while, но я не знаю, куда его подключить. Также программа не должна запускаться, пока пользователь не введет правильный формат, в противном случае код выдает некоторые исключения. Я думаю, что если я использую цикл while в правильном месте, пользователь не сможет ввести неверный ввод. Я ценю вашу помощь. Вот мой код:
import java.util.Scanner;
public class PhoneNumberConverter {
public static boolean isValidPhoneNumber(String phoneNumber) {
if (phoneNumber.matches("\d{4}\w{7}"))
return true;
else if (phoneNumber.matches("\d{1}\d{3}\w{7}"))
return true;
else
return false;
}
public static int translatePhoneNumber (String phoneNumber, int firstIndex, int lastIndex) {
int chartoNumber = 'A';
int currentIndex;
if (firstIndex == 0) {
for (currentIndex = firstIndex; currentIndex < lastIndex; currentIndex ) {
chartoNumber = phoneNumber.charAt(currentIndex);
char number = (char) chartoNumber;
System.out.print(number);
}
}
else if (firstIndex == 1) {
for (currentIndex = firstIndex; currentIndex < lastIndex; currentIndex ) {
chartoNumber = phoneNumber.charAt(currentIndex);
char number = (char) chartoNumber;
System.out.print(number);
}
}
else {
for (currentIndex = firstIndex; currentIndex < lastIndex; currentIndex ) {
if (phoneNumber.charAt(currentIndex) == 'A' || phoneNumber.charAt(currentIndex) == 'B' || phoneNumber.charAt(currentIndex) == 'C' )
chartoNumber = 2;
else if (phoneNumber.charAt(currentIndex) == 'D' || phoneNumber.charAt(currentIndex) == 'E' || phoneNumber.charAt(currentIndex) == 'F' )
chartoNumber = 3;
else if (phoneNumber.charAt(currentIndex) == 'G' || phoneNumber.charAt(currentIndex) == 'H' || phoneNumber.charAt(currentIndex) == 'I' )
chartoNumber = 4;
else if (phoneNumber.charAt(currentIndex) == 'J' || phoneNumber.charAt(currentIndex) == 'K' || phoneNumber.charAt(currentIndex) == 'L' )
chartoNumber = 5;
else if (phoneNumber.charAt(currentIndex) == 'M' || phoneNumber.charAt(currentIndex) == 'N' || phoneNumber.charAt(currentIndex) == 'O' )
chartoNumber = 6;
else if (phoneNumber.charAt(currentIndex) == 'P' || phoneNumber.charAt(currentIndex) == 'Q' || phoneNumber.charAt(currentIndex) == 'R' || phoneNumber.charAt(currentIndex) == 'S' )
chartoNumber = 7;
else if (phoneNumber.charAt(currentIndex) == 'T' || phoneNumber.charAt(currentIndex) == 'U' || phoneNumber.charAt(currentIndex) == 'V' )
chartoNumber = 8;
else if (phoneNumber.charAt(currentIndex) == 'W' || phoneNumber.charAt(currentIndex) == 'X' || phoneNumber.charAt(currentIndex) == 'Y' || phoneNumber.charAt(currentIndex) == 'Z' )
chartoNumber = 9;
else
chartoNumber = phoneNumber.charAt(currentIndex);
System.out.print(chartoNumber);
}
}
return chartoNumber;
}
public static void main(String[] args) {
System.out.println("Enter a phone number to convert:");
Scanner input = new Scanner(System.in);
String enteredNumber = input.next();
String phoneNumber = enteredNumber.toUpperCase();
boolean validationResult = isValidPhoneNumber(phoneNumber);
System.out.println(validationResult);
input.close();
translatePhoneNumber (phoneNumber, 0, 1);
System.out.print("-");
translatePhoneNumber (phoneNumber, 1, 4);
System.out.print("-");
translatePhoneNumber (phoneNumber, 4, 7);
System.out.print("-");
translatePhoneNumber (phoneNumber, 7, 11);
}
}
Ответ №1:
Вам не обязательно использовать цикл while здесь.
Вы можете создать функцию для получения входных данных, проверки их и возврата, если они действительны. Если это недопустимо, создайте исключение и при обработке исключений снова вызовите функцию.
public string getInput() {
try{
Scanner input = new Scanner(System.in);
String enteredNumber = input.next();
if(!isValidPhoneNumber(enteredNumber)
throw new InputMismatchException("Wrong Format");
else
return enteredNumber;
} catch (InputMismatchException ex){
return getInput();
}
}
Затем вызовите GetInput там, где String enteredNumber = input.next();
был ваш оригинал
итак
String enteredNumber = getInput()
Если пользователь вводит неверный ввод, функция будет вызываться до тех пор, пока не будет предоставлен правильный ввод.
Комментарии:
1. Не могли бы вы уточнить, где в моем коде должна быть вставлена ваша правка? Кажется, я не подключаю его в нужное место.
2. Само определение метода будет отправлено туда, куда вы хотите. Поместите это в конец вашего кода, если хотите. Вызов метода заменит строку, в которой вы назначили введенный номер равным вводимому пользователем. В ВАШЕМ коде у вас есть строка строкиnumber = input.next() . Замените это строкой, введенной Number = GetInput();
Ответ №2:
import java.util.Scanner;
public class PhoneNumberConverter {
public static boolean isValidPhoneNumber(String phoneNumber) {
if (phoneNumber.matches("\d{4}\w{7}"))
return true;
else if (phoneNumber.matches("\d{1}\d{3}\w{7}"))
return true;
else
return false;
}
public static int translatePhoneNumber (String phoneNumber, int firstIndex, int lastIndex) {
int chartoNumber = 'A';
int currentIndex;
if (firstIndex == 0) {
for (currentIndex = firstIndex; currentIndex < lastIndex; currentIndex ) {
chartoNumber = phoneNumber.charAt(currentIndex);
char number = (char) chartoNumber;
System.out.print(number);
}
}
else if (firstIndex == 1) {
for (currentIndex = firstIndex; currentIndex < lastIndex; currentIndex ) {
chartoNumber = phoneNumber.charAt(currentIndex);
char number = (char) chartoNumber;
System.out.print(number);
}
}
else {
for (currentIndex = firstIndex; currentIndex < lastIndex; currentIndex ) {
if (phoneNumber.charAt(currentIndex) == 'A' || phoneNumber.charAt(currentIndex) == 'B' || phoneNumber.charAt(currentIndex) == 'C' )
chartoNumber = 2;
else if (phoneNumber.charAt(currentIndex) == 'D' || phoneNumber.charAt(currentIndex) == 'E' || phoneNumber.charAt(currentIndex) == 'F' )
chartoNumber = 3;
else if (phoneNumber.charAt(currentIndex) == 'G' || phoneNumber.charAt(currentIndex) == 'H' || phoneNumber.charAt(currentIndex) == 'I' )
chartoNumber = 4;
else if (phoneNumber.charAt(currentIndex) == 'J' || phoneNumber.charAt(currentIndex) == 'K' || phoneNumber.charAt(currentIndex) == 'L' )
chartoNumber = 5;
else if (phoneNumber.charAt(currentIndex) == 'M' || phoneNumber.charAt(currentIndex) == 'N' || phoneNumber.charAt(currentIndex) == 'O' )
chartoNumber = 6;
else if (phoneNumber.charAt(currentIndex) == 'P' || phoneNumber.charAt(currentIndex) == 'Q' || phoneNumber.charAt(currentIndex) == 'R' || phoneNumber.charAt(currentIndex) == 'S' )
chartoNumber = 7;
else if (phoneNumber.charAt(currentIndex) == 'T' || phoneNumber.charAt(currentIndex) == 'U' || phoneNumber.charAt(currentIndex) == 'V' )
chartoNumber = 8;
else if (phoneNumber.charAt(currentIndex) == 'W' || phoneNumber.charAt(currentIndex) == 'X' || phoneNumber.charAt(currentIndex) == 'Y' || phoneNumber.charAt(currentIndex) == 'Z' )
chartoNumber = 9;
else
chartoNumber = phoneNumber.charAt(currentIndex);
System.out.print(chartoNumber);
}
}
return chartoNumber;
}
public static void main(String[] args) {
boolean validationResult=false;
do {
try{
System.out.println("Enter a phone number to convert:");
Scanner input = new Scanner(System.in);
String enteredNumber = input.next();
String phoneNumber = enteredNumber.toUpperCase();
validationResult = isValidPhoneNumber(phoneNumber);
if(validationResult==false){
System.out.println("Entered phone number is incorrect.");
}
System.out.println(validationResult);
input.close();
translatePhoneNumber(phoneNumber, 0, 1);
System.out.print("-");
translatePhoneNumber(phoneNumber, 1, 4);
System.out.print("-");
translatePhoneNumber(phoneNumber, 4, 7);
System.out.print("-");
translatePhoneNumber(phoneNumber, 7, 11);
System.out.println();
}
catch(Exception e){
e.printStackTrace();
}
}while(validationResult==false);
}
}
Комментарии:
1. Я использовал цикл do-while, который является циклом управления выходом. Мы должны запустить код хотя бы один раз, в этом случае цикл do-while предпочтительнее. Надеюсь, это помогло 🙂
2. Код по-прежнему не запрашивает повторно, если пользователь вводит неправильный формат.
3. Надеюсь, это поможет сейчас.