logo

Поиск символа в строке Java: методы без использования циклов

Быстрый ответ

Чтобы проверить, содержит ли строка определённый символ, в Java вы можете воспользоваться методом String.contains():

Java
Скопировать код
String str = "example";
char ch = 'a';
boolean containsChar = str.contains(String.valueOf(ch));
// Результат будет 'true', так как символ 'а' присутствует в строке "example"

Нет необходимости изобретать велосипед с циклами и исключениями, когда под рукой есть готовые методы String.contains(CharSequence) и String.indexOf(int).

Ускользающий indexOf()

Если вам требуется найти индекс символа в строке (а если его там нет, получить -1), то вы можете воспользоваться String.indexOf():

Java
Скопировать код
String str = "hello";
char ch = 'e';
int charPos = str.indexOf(ch);
// Вернётся позиция элемента; получим 1 для 'e', а при отсутствии символа получим '-1'
boolean isPresent = charPos != -1;

Зачем избегать простого пути и ловить исключения, когда метод indexOf() решает задачу без лишних заморочек.

Рекурсия: Искусство "Альпинизма"

Рекурсивные методы могут показаться некой игрой в прятки. Если вам интересно, рассмотрим рекурсивный способ поиска символа в строке.

Рекурсивный подход

Рекурсивная проверка наличия символа в строке выглядит так:

Java
Скопировать код
public static boolean containsCharRecursively(String str, char ch, int index) {
    if (index >= str.length()) {
        return false;  // Если конец строки достигнут, и символ так и не найден, возвращаем 'false'
    } else if (str.charAt(index) == ch) {
        return true;  // Заблудившийся символ был найден!
    } else {
        return containsCharRecursively(str, ch, index + 1);  // Продолжаем поиск
    }
}

String str = "recursion";
char ch = 's';
boolean contains = containsCharRecursively(str, ch, 0); // Проверяем наличие символа 's' в строке

Такой способ интересен для изучения, однако в практическом плане он менее эффективен, чем методы indexOf и contains.

Критерии выбора метода

(Простой поиск): Употребляйте String.contains(), если вам просто необходимо узнать, присутствует ли в строке определённое сочетание символов.

(Поиск с позицией): Если вам также важно узнать позицию символа, воспользуйтесь методом String.indexOf().

(Работа с образцами): Для высокой точности поиска и работы со сложными символами и образцами необходимо использовать Регулярные Выражения.

Время работы

Линейный поиск: indexOf и contains выполняют поиск за линейное время, то есть их сложность равна O(n). Это может быть проблемой для очень длинных строк или при частом выполнении таких операций.

Визуализация

Попробуем представить поиск символа в строке в форме увлекательной игры:

Markdown
Скопировать код
Строка: "Java Programming Language"
Искомый символ: 'a'

Запускаем наш снаряд в поиск:

Java
Скопировать код
// Выпускаем детектор для поиска 'a'
string.indexOf('a') != -1; // 👀📡

Вот результат нашей охоты:

Markdown
Скопировать код
Визуальная отметка: [🌊, J, 🌊, 🐟a, v, 🌊, 🐟a, 🌊, ...]
Результаты поиска: True – мы поймали нашу жертву, символ 'a' найден! (🐟a виден среди волн 🌊)

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

Особые случаи и трудности

Учтите следующие особенности:

Проверьте на пустоту и Null: Всегда проверяйте, не является ли переданная вам строка null, а также учитывайте спецсимволы, которые могут потребовать обработки.

Хитрости с юникодом: Юникодные символы, включая суррогатные пары (эмодзи, например), могут ввести в ступор indexOf, если вы не использовали метод indexOfCodePoint.

Если время – главная цель: когда всё зависит от быстродействия, вам может потребоваться выбор более эффективных алгоритмов поиска, таких как алгоритмы Бойера-Мура или Кнута-Морриса-Пратта.

Полезные материалы

  1. String (Java SE 11 & JDK 11) – Официальная документация Java про String.contains().
  2. String (Java Platform SE 7) – Описание метода String.indexOf().
  3. Java String charAt() method – javatpoint – Пояснения к методу String.charAt().
  4. Регулярные выражения в Java – Учебник – Подробное руководство по работе с регулярными выражениями в Java.
  5. Pattern (Java Platform SE 8) – Официальное руководство к классу Pattern.
  6. regex – Check and extract a number from a String in Java – Stack Overflow – Обсуждение применения методов indexOf и contains на Stack Overflow.