Java indexof все вхождения

Метод IndexOf класса String: зачем он нужен и как работает

Java-университет

Привет! Программисты часто пользуются методами на автомате, не задумываясь, как они работают. Речь идет о базовых методах, которые вы обязаны знать.

Что такое перегрузка методов?

Метод IndexOf класса String: зачем он нужен и как работает - 1

Прежде, чем мы рассмотрим метод, о котором упомянули в заголовке, давайте вспомним (а кто-то и узнает), что такое перегрузка методов. Перегрузка методов Java разрешает определение внутри одного класса двух или более методов с одним и тем же именем. Это возможно только в том случае, если у них есть разные входящие параметры. В этом случае методы и называют перегруженными, а сам процесс — перегрузкой методов.Перегрузка методов — это один из основополагающих принципов полиморфизма в Java.

Для чего нужен метод indexOf класса String

Представьте, что у вас есть длинная строка. К примеру, письмо, и вам нужно найти место, в котором происходит первое обращение к адресату по имени, которое вы уже знаете. Как вы это сделаете? Воспользуетесь методом indexOf java класса String . Этот метод — типичный пример перегрузки методов, о которой мы говорили выше.

Читайте также:  Php psr http client

Варианты метода indexOf

№ 1. indexOf(int ch)

Метод int indexOf(int ch) возвращает индекс в данной строке первого вхождения указанного символа. Другими словами, мы получим номер первого вхождения заданного символа, считая слева-направо. Пример:

 public static void main(String[] args)
 public static void main(String[] args)

P. S. Чтобы ничего не перепутать, нужно не забывать, что отсчет символов в строке идет не с «‎1,2,3…»‎, а с «‎0,1,2. »‎

№ 2. indexOf(int ch, int fromIndex)

Метод int indexOf(int ch, int fromIndex) возвращает индекс в этой строке первого вхождения указанного символа, начиная поиск по указанному индексу. Данный метод является более модернизированной версией предыдущего. C разницей в том, что мы указываем номер элемента, с которого собственно и начнется поиск. Пример:

 public static void main(String[] args)

Метод IndexOf класса String: зачем он нужен и как работает - 2

Если индекс, из которого будет вестись поиск, превышает длину строки, то ответ будет -1.Как вы наверное заметили, в сигнатуре этих двух методов (то, что принимают методы в качестве аргументов), тип для передаваемого символа указан как int , а не char . Тем не менее, мы передавали char . Все потому, что строки хранятся в виде массива байтов, где ячейки соответствует определенному символу типа char . Соответствие между байтами и char проводится по таблице ASCII. ASCII (American standard code for information interchange) — таблица, в которой распространённые печатные и непечатные символы сопоставлены с числовыми кодами. Поэтому когда передается некоторый символ char , он автоматически конвертируется в число, которое представляет данный символ в таблице ASCII. Исходя из этого, мы можем передать в метод непосредственно число ( int ), которое соответствует нужному нам символу. Например, символу ‘e’ в таблице ASCII соответствует число 101, поэтому мы можем повторить предыдущий пример, но уже без char :

 public static void main(String[] args)

P. S. В некоторых случаях данные методы взаимозаменяемые, как вот например str.indexOf(‘e’); будет аналогичен – str.indexOf(‘e’, 0); .

№ 3. indexOf(String str)

Метод int indexOf(String str) возвращает индекс в данной строке первого вхождения указанной подстроки. Он кардинально отличается от первого варианта тем, что данный метод ищет уже целую подстроку ( String ). Благодаря этому мы можем искать уже что-то более конкретное. Пример:

 public static void main(String[] args)

P. S. Все вариации indexOf чувствительны к регистру: символы верхнего регистра (большие буквы) и символы нижнего регистра (маленькие буквы) считаются как разные. Будьте внимательны.

№ 4. indexOf(String str, int fromIndex)

Метод indexOf(String str, int fromIndex) возвращает индекс в этой строке первого вхождения указанной подстроки, начиная с указанного индекса. Данный вариант является опять же более модернизированным предыдущим вариантом, но уже с указанием места, с которого будет вестись поиск. Пример:

 public static void main(String[] args)

Метод IndexOf класса String: зачем он нужен и как работает - 3

P. S. Если задать отрицательный стартовый индекс, то метод indexOf воспримет его как 0. В таком случае метод опять же станет аналогичен предыдущему (в котором не указан стартовый индекс). Это все на сегодня. Теперь твой запас знаний стал больше благодаря indexOf Java!

Источник

Использование indexOf для поиска всех вхождений слова в строке

Использование indexOf для поиска всех вхождений слова в строке

1. обзор

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

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

В любом контексте поиск настолько известен и представляет собой сложную задачу, что в народе его называютthe “Needle in a Haystack Problem”. В этом руководстве мы продемонстрируем простой алгоритм, использующий методindexOf(String str, int fromIndex) классаString Java для поиска всех вхождений слова в строке.

2. Простой алгоритм

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

  1. Поискwill find the word even within words in the text. Следовательно, если мы ищем слово «способный», мы найдем его в словах «удобный» и «планшет».
  2. Поискwill be case-insensitive.
  3. Алгоритмis based on the naïve string search approach. Это означает, что, поскольку мы наивны относительно характера символов в слове и текстовой строке, мы будем использовать грубую силу, чтобы проверить каждое место текста на наличие вхождения искомого слова.

2.1. Реализация

Теперь, когда мы определили параметры поиска, давайте напишем простое решение:

public class WordIndexer < public ListfindWord(String textString, String word) < Listindexes = new ArrayList(); String lowerCaseTextString = textString.toLowerCase(); String lowerCaseWord = word.toLowerCase(); int index = 0; while(index != -1) < index = lowerCaseTextString.indexOf(lowerCaseWord, index); if (index != -1) < indexes.add(index); index++; >> return indexes; > >

2.2. Тестирование решения

Чтобы протестировать наш алгоритм, мы воспользуемся фрагментом известного отрывка из Шекспировского Гамлета и введем в поиск слово «или», которое встречается пять раз:

@Test public void givenWord_whenSearching_thenFindAllIndexedLocations() < String theString; WordIndexer wordIndexer = new WordIndexer(); theString = "To be, or not to be: that is the question: " + "Whether 'tis nobler in the mind to suffer " + "The slings and arrows of outrageous fortune, " + "Or to take arms against a sea of troubles, " + "And by opposing end them? To die: to sleep; " + "No more; and by a sleep to say we end " + "The heart-ache and the thousand natural shocks " + "That flesh is heir to, 'tis a consummation " + "Devoutly to be wish'd. To die, to sleep; " + "To sleep: perchance to dream: ay, there's the rub: " + "For in that sleep of death what dreams may come,"; ListexpectedResult = Arrays.asList(7, 122, 130, 221, 438); List actualResult = wordIndexer.findWord(theString, "or"); assertEquals(expectedResult, actualResult); >

Когда мы запускаем наш тест, мы получаем ожидаемый результат. Searching for “or” yields five instances embedded in various ways in the text string:с

index of 7, in "or" index of 122, in "fortune" index of 130, in "Or index of 221, in "more" index of 438, in "For"

С математической точки зрения алгоритм имеет нотацию Big-OO(m*(n-m)), гдеm — длина слова, аn — длина текстовой строки. Этот подход может быть подходящим для текстовых строк из стога сена в несколько тысяч символов, но будет невыносимо медленным, если есть миллиарды символов.

3. Улучшенный алгоритм

Простой пример, приведенный выше, демонстрирует наивный грубый подход к поиску данного слова в текстовой строке. Таким образом, он будет работать для любого поискового слова и любого текста.

Если мы заранее знаем, что искомое слово не содержит повторяющихся символов, таких как «ааа», то мы можем написать немного более эффективный алгоритм.

В этом случае мы можем безопасно избежать резервного копирования, чтобы перепроверить каждое место в текстовой строке как потенциальное начальное местоположение. После того, как мы вызовем методindexOf( ), мы просто переместимся в место сразу после конца последнего найденного вхождения. Эта простая настройка дает наилучший сценарийO(n).

Давайте посмотрим на эту расширенную версию более раннего методаfindWord( ).

public List findWordUpgrade(String textString, String word) < Listindexes = new ArrayList(); StringBuilder output = new StringBuilder(); String lowerCaseTextString = textString.toLowerCase(); String lowerCaseWord = word.toLowerCase(); int wordLength = 0; int index = 0; while(index != -1) < index = lowerCaseTextString.indexOf(lowerCaseWord, index + wordLength); // Slight improvement if (index != -1) < indexes.add(index); >wordLength = word.length(); > return indexes; >

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

В этом уроке мы представили алгоритм поиска без учета регистра, чтобы найти все варианты слова в большей текстовой строке. Но не позволяйте этому скрывать тот факт, что методindexOf() класса JavaString по своей природе чувствителен к регистру и может различать, например, «Bob» и «bob».

В целомindexOf() представляет собой удобный метод поиска последовательности символов, скрытой в текстовой строке, без какого-либо кодирования для манипуляций с подстрокой.

Как обычно, полная кодовая база этого примера -over on GitHub.

Источник

Использование indexOf для поиска всех вхождений слова в строке

Узнайте, как решить проблему “иголка в стоге сена”, используя метод indexOf для поиска всех вхождений слова в более крупной текстовой строке.

1. Обзор

Рутинная работа по поиску шаблона символов или слова в более крупной текстовой строке выполняется в различных полях. Например, в биоинформатике нам может потребоваться найти фрагмент ДНК в хромосоме.

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

В любом контексте поиск настолько хорошо известен и пугает рутиной, что в народе его называют “Проблемой иголки в стоге сена” . В этом уроке мы продемонстрируем простой алгоритм, который использует метод indexOf(String str, int fromIndex) класса Java String для поиска всех вхождений слова в строке.

2. Простой алгоритм

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

  1. Поиск найдет слово даже внутри слов в тексте . Поэтому, если мы ищем слово “способный”, то мы найдем его в словах “удобный” и “планшет”.
  2. Поиск будет осуществляться без учета регистра .
  3. Алгоритм основан на наивном подходе поиска строк . Это означает, что, поскольку мы наивны в отношении природы символов в слове и текстовой строке, мы будем использовать грубую силу, чтобы проверить каждое местоположение текста на наличие экземпляра поискового слова.

2.1. Реализация

Теперь, когда мы определили параметры для вашего поиска, давайте напишем простое решение:

public class WordIndexer < public ListfindWord(String textString, String word) < Listindexes = new ArrayList(); String lowerCaseTextString = textString.toLowerCase(); String lowerCaseWord = word.toLowerCase(); int index = 0; while(index != -1) < index = lowerCaseTextString.indexOf(lowerCaseWord, index); if (index != -1) < indexes.add(index); index++; >> return indexes; > >

2.2. Тестирование решения

Чтобы проверить наш алгоритм, мы используем фрагмент знаменитого отрывка из “Гамлета” Шекспира и ищем слово “или”, которое появляется пять раз:

@Test public void givenWord_whenSearching_thenFindAllIndexedLocations() < String theString; WordIndexer wordIndexer = new WordIndexer(); theString = "To be, or not to be: that is the question: " + "Whether 'tis nobler in the mind to suffer " + "The slings and arrows of outrageous fortune, " + "Or to take arms against a sea of troubles, " + "And by opposing end them? To die: to sleep; " + "No more; and by a sleep to say we end " + "The heart-ache and the thousand natural shocks " + "That flesh is heir to, 'tis a consummation " + "Devoutly to be wish'd. To die, to sleep; " + "To sleep: perchance to dream: ay, there's the rub: " + "For in that sleep of death what dreams may come,"; ListexpectedResult = Arrays.asList(7, 122, 130, 221, 438); List actualResult = wordIndexer.findWord(theString, "or"); assertEquals(expectedResult, actualResult); >

Когда мы запускаем наш тест, мы получаем ожидаемый результат. Поиск “или” дает пять экземпляров, встроенных различными способами в текстовую строку:

index of 7, in "or" index of 122, in "fortune" index of 130, in "Or index of 221, in "more" index of 438, in "For"

В математических терминах алгоритм имеет обозначение Big-O O(m*(n-m)) , где m – длина слова и n – длина текстовой строки. Этот подход может быть подходящим для текстовых строк стога сена из нескольких тысяч символов, но будет невыносимо медленным, если в нем миллиарды символов.

3. Улучшенный алгоритм

Простой пример выше демонстрирует наивный, грубый подход к поиску заданного слова в текстовой строке. Таким образом, он будет работать для любого поискового слова и любого текста.

Если мы заранее знаем, что поисковое слово не содержит повторяющегося набора символов, таких как “aaa”, то мы можем написать немного более эффективный алгоритм.

В этом случае мы можем безопасно избежать резервного копирования, чтобы повторно проверить каждое местоположение в текстовой строке в качестве потенциального начального местоположения. После того, как мы вызовем метод indexOf () , мы просто перейдем к местоположению сразу после окончания последнего найденного вхождения. Эта простая настройка дает наилучший сценарий O(n) .

Давайте рассмотрим эту расширенную версию более раннего метода find Word ( ) .

public List findWordUpgrade(String textString, String word) < Listindexes = new ArrayList(); StringBuilder output = new StringBuilder(); String lowerCaseTextString = textString.toLowerCase(); String lowerCaseWord = word.toLowerCase(); int wordLength = 0; int index = 0; while(index != -1) < index = lowerCaseTextString.indexOf(lowerCaseWord, index + wordLength); // Slight improvement if (index != -1) < indexes.add(index); >wordLength = word.length(); > return indexes; >

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

В этом уроке мы представили алгоритм поиска без учета регистра, позволяющий найти все варианты слова в более крупной текстовой строке. Но не позволяйте этому скрыть тот факт, что метод Java String class’ indexOf() по своей сути чувствителен к регистру и может различать, например, “Bob” и “bob”.

В целом, indexOf () – это удобный метод поиска последовательности символов, скрытой в текстовой строке, без какого-либо кодирования для манипуляций с подстроками.

Как обычно, полная кодовая база этого примера находится на GitHub .

Источник

Оцените статью