Не пойму как написать проверки без использования регулярных выражений, нужно написать проверки для тестов, они прилагаются в коде
Напишите программу, которая на входе через консоль принимает фамилию, имя и отчество одной строкой (например, «Иванов Сергей Петрович») и выводит фамилию, имя и отчество отдельно в формате:
Фамилия: Иванов
Имя: Сергей
Отчество: Петрович
Валидная строка от пользователя, которую мы можем интерпретировать как Ф. И. О., должна содержать три слова, состоящих из символов кириллицы, разделённых пробелом, может содержать дефис. Если строка не соответствует формату, то вывести в консоль: Введенная строка не является ФИО
Использование регулярных выражений в данном задании не допускается.
Строго соблюдайте формат вывода результата. Мне нужно написать проверки для тестов, где будет проверяться
launchApplication(
collectTestInput("Иван Иван Иванович ввввв"),
collectTestOutput("Введенная строка не является ФИО"));
}
launchApplication(
collectTestInput("1111 2222 3333"),
collectTestOutput("Введенная строка не является ФИО"));
}
launchApplication(
collectTestInput("Иван"),
collectTestOutput("Введенная строка не является ФИО"));
}
это из тестов-----------------------------------------------
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
String input = scanner.nextLine();
if (input.equals("0")) {
break;
}
//TODO:напишите ваш код тут, результат вывести в консоль.
//При невалидном ФИО вывести в консоль: Введенная строка не является ФИО
String name = input;
int spaceIndex = name.indexOf(' ');
int spaceIndex1 = name.lastIndexOf(' ');
System.out.println("Фамилия: " + name.substring(0, spaceIndex));
System.out.println("Имя: " + name.substring(spaceIndex, spaceIndex1));
System.out.println("Отчество: " + name.substring(spaceIndex1));
}
}
Ответы (2 шт):
Лучше всего здесь подходит метод split() из String, но он принимает регулярное выражение (если вам нельзя использовать именно Pattern и Matcher, то используйте его, а если вам вообще нельзя работать с регулярками, то не используйте).
Ещё я набросал вот такой метод:
public void strValidate(String fullName) {
char[] chars = fullName.toCharArray();
StringBuilder name = new StringBuilder();
StringBuilder surname = new StringBuilder();
StringBuilder secondName = new StringBuilder();
int flag = 0;
for (int i = 0; i < chars.length; i++) {
char cur = chars[i];
if (cur == ' ') {
flag++;
continue;
}
switch (flag) {
case 0:
name.append(cur);
break;
case 1:
surname.append(cur);
break;
case 2:
secondName.append(cur);
break;
}
}
}
Строка разбивается на массив char и проходится по циклу. Берётся новый символ и в зависимости от состояния флага кладётся в один из StringBuilder. Если встречается пробел, то флаг увеличивается на 1. Вы можете добавить в этот метод нужные вам проверки и вывод в консоль.
Если без регулярок, у меня получилось вот так длинно с проверкой пробелов и наличия цифр
Все тесты проходит, может, кому пригодится
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
String input = scanner.nextLine();
if (input.equals("0")) {
break;
}
String name = input;
int space = 0;
for (int s = 0; s < name.length(); s++) {
if (name.charAt(s) == ' ') {
space++; //считаем количество пробелов между словами, введенными в консоль
}
}
for (int i = 0; i < name.length(); i++) {
//условие, исключающее наличие цифр
if (name.charAt(i) >= '0' && name.charAt(i) <= '9'
// условие проверки количества пробелов,
// слов должно быть 3, значит количество пробелов
// - не больше 2 и не равно 0
|| space > 2 || space == 0)
{
System.out.println("Введенная строка не является ФИО");
break;
} else {
System.out.println(
"Фамилия: " + name.substring(0, name.indexOf(' ')) + System.lineSeparator() +
"Имя:" + name.substring(name.indexOf(' '), name.lastIndexOf(' ')) + System.lineSeparator() +
"Отчество:" + name.substring(name.lastIndexOf(' ')));
break;
}
}
}
}
}