- Проверка гласной с помощью метода 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 .