Перейти к основному содержимому

Проверьте, является ли символ гласным в Java

· 4 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA
  1. Проверка гласной с помощью метода indexOf

1. Обзор

При обработке символов из строки мы можем захотеть классифицировать их в зависимости от того, принадлежат ли они к определенной группе. Например, символы английского алфавита — это либо гласные, либо согласные.

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

2. Проверка гласных с помощью метода indexOf

Поскольку мы знаем все гласные, мы можем добавить их как в верхнем, так и в нижнем регистре в String :

String VOWELS = "aeiouAEIOU";

Мы можем использовать метод indexOf в классе String , чтобы увидеть, присутствует ли символ :

boolean isInVowelsString(char c) {
return VOWELS.indexOf(c) != -1;
}

Если символ присутствует, индекс не будет равен -1 . Если это -1 , то символ не входит в набор гласных. Давайте проверим это:

assertThat(isInVowelsString('e')).isTrue();
assertThat(isInVowelsString('z')).isFalse();

Здесь мы используем char в Java. Если бы наш персонаж был односимвольным объектом String , мы могли бы использовать другую реализацию:

boolean isInVowelsString(String c) {
return VOWELS.contains(c);
}

Он пройдет те же тесты:

assertThat(isInVowelsString("e")).isTrue();
assertThat(isInVowelsString("z")).isFalse();

Как мы видим, реализация этого метода требует небольших затрат. Однако нам нужно перебрать 10 возможных гласных в строке гласных, чтобы определить, входит ли что-то в группу или нет.

3. Проверка гласных с помощью переключателя

Вместо этого мы могли бы использовать оператор switch , в котором каждая гласная является отдельным регистром :

boolean isVowelBySwitch(char c) {
switch (c) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
case 'A':
case 'E':
case 'I':
case 'O':
case 'U':
return true;
default:
return false;
}
}

Мы также можем проверить это:

assertThat(isVowelBySwitch('e')).isTrue();
assertThat(isVowelBySwitch('z')).isFalse();

Поскольку Java поддерживает String в операторах switch , мы могли бы также реализовать это с односимвольными строками.

4. Проверка гласных с помощью регулярных выражений

Хотя мы можем реализовать наши собственные алгоритмы сопоставления строк, механизм регулярных выражений Java позволяет нам эффективно сопоставлять строки .

Давайте создадим регулярное выражение для распознавания гласной:

Pattern VOWELS_PATTERN = Pattern.compile("[aeiou]", Pattern.CASE_INSENSITIVE);

[] используются для представления класса символов . Мы поместили гласные в этот класс только в нижнем регистре, так как мы можем сопоставлять их без учета регистра.

Давайте реализуем наш алгоритм сопоставления для объектов String с одним символом в:

boolean isVowelByRegex(String c) {
return VOWELS_PATTERN.matcher(c).matches();
}

Давайте проверим это:

assertThat(isVowelByRegex("e")).isTrue();
assertThat(isVowelByRegex("E")).isTrue();

Как мы видим, регулярное выражение нечувствительно к регистру.

Следует отметить, что для этого требуется, чтобы ввод был строкой, а не символом. Хотя мы можем преобразовать символ в строку с помощью метода toString класса Character `` :

assertThat(isVowelByRegex(Character.toString('e'))).isTrue();

Использование регулярных выражений упрощает решение общего случая этой проблемы. Мы можем указать любую группу символов, используя классы символов, включая диапазоны символов.

5. Какое решение следует использовать?

Решение на основе String , вероятно, является самым простым для понимания и работает довольно хорошо, поскольку ему нужно проверить максимум 10 вариантов для каждого символа, который он классифицирует.

Однако обычно мы ожидаем, что оператор switch будет работать быстрее, чем поиск String .

Решение с регулярными выражениями должно работать очень хорошо, так как регулярные выражения оптимизируются во время метода компиляции Pattern . Однако регулярные выражения могут быть более сложными в реализации и могут не стоить сложности для такой простой вещи, как обнаружение гласных. Точно так же, если мы работаем со значениями char , регулярное выражение требует некоторого преобразования, которого нет у других методов.

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

6. Заключение

В этой статье мы рассмотрели несколько различных способов определить, является ли символ гласным. Мы увидели, как можно использовать строку со всеми гласными и как реализовать оператор switch .

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

Как всегда, полный код этого руководства можно найти на GitHub .