Я имею некоторое общее представление о том, как сделать эту задачу, но я не уверен, делаю ли я его правильно. Таким образом, у нас есть класс WindyString с ударом метода. После использования его:
System.out.println(WindyString.blow(
"Abrakadabra! The second chance to pass has already BEGUN! "));
мы должны получить что-то вроде этого:
e a e a a ea y
br k d br ! Th s c nd ch nc t p ss h s lr d B G N!
A a a a a e o o a E U
так вкратце в каждом втором слове мы выбираем каждый гласные и перемещаем их одна строка выше. Во второй половине слов мы перемещаем гласные одна строка ниже.
Я знаю, что должен разделить строку к маркерам с токенизатором или разделить метод, но что затем? Создать 3 массива каждое представление каждой строки?
Самый простой способ - использовать регулярное выражение. Это должно быть поучительно:
static String blow(String s) {
String vowels = "aeiouAEIOU";
String middle = s.replaceAll("[" + vowels + "]", " ");
int flip = 0;
String[] side = { "", "" };
Scanner sc = new Scanner(s);
for (String word; (word = sc.findInLine("\\s*\\S*")) != null; ) {
side[flip] += word.replaceAll(".", " ");
side[1-flip] += word.replaceAll("[^" + vowels + "]", " ");
flip = 1-flip;
}
return String.format("|%s|%n|%s|%n|%s|", side[0], middle, side[1]);
}
Я добавил символы |
в вывод, чтобы показать, что это обрабатывает лишние пробелы правильно - всем трем строкам гарантирована одинаковая длина, заботясь о начальных и конечных пробелах, или даже ВСЕ пробелы.
Если вы не знакомы с регулярными выражениями, это определенно полезно для начала обучения.
Середина
- это просто исходная строка, в которой все гласные заменены пробелами.
Тогда сторона [0]
и сторона [1]
- это верхняя и нижняя строки соответственно. Мы используем Сканер
для извлечения каждого слова (с сохранением начальных и конечных пробелов). Мы обрабатываем каждое слово так, что с одной стороны все заменяется пробелами; в другом случае пробелами заменяются только негласные. Мы переворачиваем каждое слово, которое обрабатываем.
Да, это, вероятно, простой (не очень производительный) способ решить проблему.
Создайте 3 массива: один заполнен фактическими данными и 2 массива заполняются ( Arrays.fill
) с помощью ''
.
Затем перебираем массив, содержащий фактические данные, и сохраняем целое число того слова, на котором вы сейчас находитесь и логическое значение, если вы уже указали пробелы.
Пока При повторении вы проверяете, является ли символ гласным или нет. Если это гласный звук, проверьте количество слов (нечетность / четность) и поместите его в первый или третий массив. Когда вы достигнете пробела, установите логическое значение и увеличьте количество слов. Если вы дойдете до другого пробела, проверьте, установлен ли уже пробел: если да, продолжайте. Если вы соответствуете непробельному символу, сбросьте логическое значение пробела.
Затем объедините все массивы вместе и добавьте символ новой строки между каждым объединенным массивом и верните строку.