Код, который вы написали, не пройдет все тесты, и нет способа исправить это, не изменив «как это работает». Проблема в том, что пробелы нельзя использовать для разделения или разделения различных частей. Если строка типа "Steem, Lois"
не заканчивается символом пробела, метод просто вернет " Steem"
, что неверно. Также, если строка заканчивается на " "
после начальной точки, она будет содержать начальную букву внутри имени.
Я предоставил вам два разных решения.
Предположим, у нас есть строка с следующий формат "{lastname}, {firstname} {initial}."
, где начальное необязательно. Эта строка передается методу StringFormat
, поэтому мы предполагаем, что аргумент правильно сформирован.
Первое решение удаляет пробелы, извлекает начальное, если оно заканчивается точкой, а затем извлекает имя и фамилию. Все это делается с помощью манипуляции со строками.
public static String StringReformat(String name) {
String initial = null, first, last;
//Removes all whitespaces
name = name.replaceAll("\\s", "");
//Checks if there is initial and extracts it
if(name.endsWith(".")) {
initial = name.substring(name.length() - 2, name.length() - 1);
name = name.substring(0, name.length() - 2);
}
//Gets first and last name
String[] tokens = name.split(",");
first = tokens[1];
last = tokens[0];
if(initial != null) {
return first + " " + initial + " " + last;
} else {
return first + " " + last;
}
}
Второе решение использует Matcher для проверки соответствия указанной строки имени регулярному выражению имени и извлечения частей имени.
public static String StringReformat(String name) {
Pattern pattern = Pattern.compile(
"([a-zA-Z]+)\\s*,\\s*([a-zA-Z]+)\\s*(?:([A-Z])\\.)?");
Matcher matcher = pattern.matcher(name.trim());
if(matcher.matches()) {
String last = matcher.group(1);
String first = matcher.group(2);
String initial = matcher.group(3);
if(initial != null) {
return first + " " + initial + " " + last;
} else {
return first + " " + last;
}
}
throw new IllegalArgumentException("Invalid name argument format!");
}
Второе решение лучше и более «управляемо», но труднее понять, если вы новичок.