Ветер, дующий на Строке

Я имею некоторое общее представление о том, как сделать эту задачу, но я не уверен, делаю ли я его правильно. Таким образом, у нас есть класс 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 массива каждое представление каждой строки?

5
задан Peter Lang 7 March 2010 в 20:30
поделиться

2 ответа

Самый простой способ - использовать регулярное выражение. Это должно быть поучительно:

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] - это верхняя и нижняя строки соответственно. Мы используем Сканер для извлечения каждого слова (с сохранением начальных и конечных пробелов). Мы обрабатываем каждое слово так, что с одной стороны все заменяется пробелами; в другом случае пробелами заменяются только негласные. Мы переворачиваем каждое слово, которое обрабатываем.

2
ответ дан 14 December 2019 в 08:48
поделиться

Да, это, вероятно, простой (не очень производительный) способ решить проблему.

Создайте 3 массива: один заполнен фактическими данными и 2 массива заполняются ( Arrays.fill ) с помощью '' .

Затем перебираем массив, содержащий фактические данные, и сохраняем целое число того слова, на котором вы сейчас находитесь и логическое значение, если вы уже указали пробелы.

Пока При повторении вы проверяете, является ли символ гласным или нет. Если это гласный звук, проверьте количество слов (нечетность / четность) и поместите его в первый или третий массив. Когда вы достигнете пробела, установите логическое значение и увеличьте количество слов. Если вы дойдете до другого пробела, проверьте, установлен ли уже пробел: если да, продолжайте. Если вы соответствуете непробельному символу, сбросьте логическое значение пробела.

Затем объедините все массивы вместе и добавьте символ новой строки между каждым объединенным массивом и верните строку.

5
ответ дан 14 December 2019 в 08:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: