Свинья Латинской игру разрешен с помощью регулярных выражений в Java


Я воссоздал свинья Латинской игры на Java. Программа принимает произвольное количество аргументов командной строки, как слова, и выводит на стандартный вывод эти слова перевести со следующими правилами:

  • Для слов, которые начинаются с согласных букв, все буквы до первой гласной, перемещаются в конец, и он добавляется в последовательность "Ай";
  • Для слов, которые начинаются с гласной, просто добавлена последовательность "путь".

Насчет реализации, я использовал регулярное выражение для разбиения на слова. Я думаю, что это элегантное решение, может быть менее эффективен против конкретного выполнения правил.

Код составлен только с классом, PigLatin. Вы можете скомпилировать его с javac PigLatin.java и работать с java PigLatin <word> .... Здесь есть PigLatin.java:

/**
 * This small program implements the game Pig Latin. You can specify one or more
 * words as a command line argument, and the program will print the modified
 * version on the standard output.
 *
 * The rules of the game are:
 *      - For words that begin with a consonant, all letters before the first
 *        vowel are placed at the end of the word, then the sequence "ay" is
 *        appended.
 *      - For words that begin with a vowel, it is appended the sequence "way".
 *
 * Note that command line arguments are limited.
 *
 * Note that you should only use uppercase or lowercase letters.
 */
public class PigLatin {
    public static void main(String[] args) {
        for (int i = 0; i < args.length; i++) {
            System.out.print(convertWord(args[i]));

            if (i < args.length - 1)
                System.out.print(" ");
            else
                System.out.println();
        }
    }

    /*
     * This method convert a word using Pig Latin rules.
     *
     * @param word the word to convert
     *
     * @return the converted word
     */
    private static String convertWord(String word) {
        /* If the word begins with a consonant (or more), this regex splits the
         * word into two groups: the first are the consonants before the first
         * vowel, the second is the rest of the string.
         * If the word begins with a vowel, only a single group is returned.
         */
        String[] tokens = word.split("^([^aeiouAEIOU]*)(\\w*)");

        if (tokens.length == 2)
            return String.join(tokens[1], tokens[0], "ay");
        else
            return word + "way";
    }
}


416
2
задан 18 февраля 2018 в 07:02 Источник Поделиться
Комментарии
1 ответ

Ваш код выглядит нормально. Я бы написал это с другим подходом. Это до вас, что лучше.

public static String pigLatin(String word) {
Pattern firstVowelPattern = Pattern.compile("^([aeiouAEIOU])");
Matcher matcher = firstVowelPattern.matcher(word);
if (matcher.find()) return word + "way";
return word.replaceAll("^([^aeiouAEIOU]*)(.+)", "$2$1ay");
}

Я не использую любые массивы и разбиваем строку, но я это решаю с более регулярное выражение. Ключевым элементом этого решения является как заменяет работы. В первом параметре, я прохожу по двум регулярное выражение, а во втором параметре я переключаю результаты их использования 2 $$1.

Как вы видите, я не использовал if-else заявление, только if. В вашем решении else также является излишним.

1
ответ дан 18 февраля 2018 в 08:02 Источник Поделиться