Looking back at the original question, we need to find some given keywords in a given sentence, count the number of occurrences and know something about where. I don’t quite understand what «where» means (is it an index in the sentence?), so I’ll pass that one… I’m still learning java, one step at a time, so I’ll see to that one in due time
It must be noticed that common sentences (as the one in the original question) can have repeated keywords, therefore the search cannot just ask if a given keyword «exists or not» and count it as 1 if it does exist. There can be more then one of the same. For example:
// Base sentence (added punctuation, to make it more interesting):
String sentence = "Say that 123 of us will come by and meet you, "
+ "say, at the woods of 123woods.";
// Split it (punctuation taken in consideration, as well):
java.util.List<String> strings =
java.util.Arrays.asList(sentence.split(" |,|\."));
// My keywords:
java.util.ArrayList<String> keywords = new java.util.ArrayList<>();
keywords.add("123woods");
keywords.add("come");
keywords.add("you");
keywords.add("say");
By looking at it, the expected result would be 5 for «Say» + «come» + «you» + «say» + «123woods», counting «say» twice if we go lowercase. If we don’t, then the count should be 4, «Say» being excluded and «say» included. Fine. My suggestion is:
// Set... ready...?
int counter = 0;
// Go!
for(String s : strings)
{
// Asking if the sentence exists in the keywords, not the other
// around, to find repeated keywords in the sentence.
Boolean found = keywords.contains(s.toLowerCase());
if(found)
{
counter ++;
System.out.println("Found: " + s);
}
}
// Statistics:
if (counter > 0)
{
System.out.println("In sentence: " + sentence + "n"
+ "Count: " + counter);
}
And the results are:
Found: Say
Found: come
Found: you
Found: say
Found: 123woods
In sentence: Say that 123 of us will come by and meet you, say, at the woods of 123woods.
Count: 5
Strings are a very important aspect from a programming perspective as many questions can be framed out among strings. There arise wide varied sets of concepts and questions that are pivotal to understanding strings. Now over here will be discussing different ways to play with strings where we will be playing with characters with strings and substrings which is a part of input strings with help of inbuilt methods and also by proposing logic listing wide varied ways as follows:
Searching a Character in the String
Way 1: indexOf(char c)
It searches the index of specified characters within a given string. It starts searching from the beginning to the end of the string (from left to right) and returns the corresponding index if found otherwise returns -1.
Note: If the given string contains multiple occurrences of a specified character then it returns the index of the only first occurrence of the specified character.
Syntax:
int indexOf(char c) // Accepts character as argument, Returns index of // the first occurrence of specified character
Way 2: lastIndexOf(char c)
It starts searching backward from the end of the string and returns the index of specified characters whenever it is encountered.
Syntax:
public int lastIndexOf(char c) // Accepts character as argument, Returns an // index of the last occurrence specified // character
Way 3: indexOf(char c, int indexFrom)
It starts searching forward from the specified index in the string and returns the corresponding index when the specified character is encountered otherwise returns -1.
Note: The returned index must be greater than or equal to the specified index.
Syntax:
public int IndexOf(char c, int indexFrom)
Parameters:
- The character to be searched
- An integer from where searching
Return Type: An index of a specified character that appeared at or after the specified index in a forwarding direction.
Way 4: lastIndexOf(char c, int fromIndex)
It starts searching backward from the specified index in the string. And returns the corresponding index when the specified character is encountered otherwise returns -1.
Note: The returned index must be less than or equal to the specified index.
Syntax:
public int lastIndexOf(char c, int fromIndex)
Way 5: charAt(int indexNumber)
Returns the character existing at the specified index, indexNumber in the given string. If the specified index number does not exist in the string, the method throws an unchecked exception, StringIndexOutOfBoundsException.
Syntax:
char charAt(int indexNumber)
Example:
Java
import
java.io.*;
class
GFG {
public
static
void
main(String[] args)
{
String str
=
"GeeksforGeeks is a computer science portal"
;
int
firstIndex = str.indexOf(
's'
);
System.out.println(
"First occurrence of char 's'"
+
" is found at : "
+ firstIndex);
int
lastIndex = str.lastIndexOf(
's'
);
System.out.println(
"Last occurrence of char 's' is"
+
" found at : "
+ lastIndex);
int
first_in = str.indexOf(
's'
,
10
);
System.out.println(
"First occurrence of char 's'"
+
" after index 10 : "
+ first_in);
int
last_in = str.lastIndexOf(
's'
,
20
);
System.out.println(
"Last occurrence of char 's'"
+
" after index 20 is : "
+ last_in);
int
char_at = str.charAt(
20
);
System.out.println(
"Character at location 20: "
+ char_at);
}
}
Output
First occurrence of char 's' is found at : 4 Last occurrence of char 's' is found at : 28 First occurrence of char 's' after index 10 : 12 Last occurrence of char 's' after index 20 is : 15 Character at location 20: 111
Way 6: Searching Substring in the String
The methods used for searching a character in the string which are mentioned above can also be used for searching the substring in the string.
Example
Java
import
java.io.*;
class
GFG {
public
static
void
main(String[] args)
{
String str
=
"GeeksforGeeks is a computer science portal"
;
int
firstIndex = str.indexOf(
"Geeks"
);
System.out.println(
"First occurrence of char Geeks"
+
" is found at : "
+ firstIndex);
int
lastIndex = str.lastIndexOf(
"Geeks"
);
System.out.println(
"Last occurrence of char Geeks is"
+
" found at : "
+ lastIndex);
int
first_in = str.indexOf(
"Geeks"
,
10
);
System.out.println(
"First occurrence of char Geeks"
+
" after index 10 : "
+ first_in);
int
last_in = str.lastIndexOf(
"Geeks"
,
20
);
System.out.println(
"Last occurrence of char Geeks "
+
"after index 20 is : "
+ last_in);
}
}
Output
First occurrence of char Geeks is found at : 0 Last occurrence of char Geeks is found at : 8 First occurrence of char Geeks after index 10 : -1 Last occurrence of char Geeks after index 20 is : 8
Way 7: contains(CharSequence seq): It returns true if the string contains the specified sequence of char values otherwise returns false. Its parameters specify the sequence of characters to be searched and throw NullPointerException if seq is null.
Syntax:
public boolean contains(CharSequence seq)
Note: CharSequence is an interface that is implemented by String class, Therefore we use string as an argument in contains() method.
Example
Java
import
java.io.*;
import
java.lang.*;
class
GFG {
public
static
void
main(String[] args)
{
String test =
"software"
;
CharSequence seq =
"soft"
;
boolean
bool = test.contains(seq);
System.out.println(
"Found soft?: "
+ bool);
boolean
seqFound = test.contains(
"war"
);
System.out.println(
"Found war? "
+ seqFound);
boolean
sqFound = test.contains(
"wr"
);
System.out.println(
"Found wr?: "
+ sqFound);
}
}
Output
Found soft?: true Found war? true Found wr?: false
Way 8: Matching String Start and End
- boolean startsWith(String str): Returns true if the string str exists at the starting of the given string, else false.
- boolean startsWith(String str, int indexNum): Returns true if the string str exists at the starting of the index indexNum in the given string, else false.
- boolean endsWith(String str): Returns true if the string str exists at the ending of the given string, else false.
Example:
Java
import
java.io.*;
class
GFG {
public
static
void
main(String[] args)
{
String str
=
"GeeksforGeeks is a computer science portal"
;
System.out.println(str.startsWith(
"Geek"
));
System.out.println(str.startsWith(
"is"
,
14
));
System.out.println(str.endsWith(
"port"
));
}
}
This article is contributed by Nitsdheerendra. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Last Updated :
16 Feb, 2023
Like Article
Save Article
Поиск подстроки
Последнее обновление: 02.03.2023
Функция find() возвращает индекс первого вхождения подстроки или отдельного символа в строке в виде значние я типа size_t
:
#include <iostream> #include <string> int main() { std::string text {"A friend in need is a friend indeed."}; std::cout << text.find("ed") << std::endl; // 14 std::cout << text.find("friend") << std::endl; // 2 std::cout << text.find('d') << std::endl; // 7 std::cout << text.find("apple") << std::endl; // 18446744073709551615 }
Если строка или символ не найдены (как в примере выше в последнем случае), то возвращается специальная константа std::string::npos,
которая представляет очень большое число (как видно из примера, число 18446744073709551615). И при поиске мы можем проверять результат функции find()
на равенство этой константе:
if (text.find("banana") == std::string::npos) { std::cout << "Not found" << std::endl; }
Функция find
имеет ряд дополнительных версий. Так, с помощью второго параметра мы можем указать индекс, с которого надо вести поиск:
#include <iostream> #include <string> int main() { std::string text {"A friend in need is a friend indeed."}; // поиск с 10-го индекса std::cout << text.find("friend", 10) << std::endl; // 22 }
Используя эту версию, мы можем написать программу для поиска количества вхождений строки в тексте, то есть выяснить, сколько раз строка встречается в тексте:
#include <iostream> #include <string> int main() { std::string text {"A friend in need is a friend indeed."}; std::string word {"friend"}; unsigned count{}; // количество вхождений for (unsigned i {}; i <= text.length() - word.length(); ) { // получаем индекс size_t position = text.find(word, i); // если не найдено ни одного вхождения с индекса i, выходим из цикла if (position == std::string::npos) break; // если же вхождение найдено, увеличиваем счетчик вхождений ++count; // переходим к следующему индексу после position i = position + 1; } std::cout << "The word is found " << count << " times." << std::endl; // The word is found 2 times. }
Здесь в цикле пробегаемся по тексту, в котором надо найти строку, пока счетчик i не будет равен text.length() - word.length()
.
С помощью функции find()
получаем индекс первого вхождения слова в тексте, начиная с индекса i. Если таких вхождений не найдено, то выходим из цикла.
Если же найден индекс, то счетчик i получает индекс, следующий за индексом найденного вхождения.
В итоге, поскольку искомое слово «friend» встречается в тексте два раза, то программа выведет
The word is found 2 times.
В качестве альтернативы мы могли бы использовать цикл while
:
#include <iostream> #include <string> int main() { std::string text {"A friend in need is a friend indeed."}; std::string word {"friend"}; unsigned count{}; // количество вхождений size_t index{}; // начальный индекс while ((index = text.find(word, index)) != std::string::npos) { ++count; index += word.length(); // перемещаем индекс на позицию после завершения слова в тексте } std::cout << "The word is found " << count << " times." << std::endl; }
Еще одна версия позволяет искать в тексте не всю строку, а только ее часть. Для этого в качестве третьего параметра передается количество символов из искомой строки, которые программа будет искать в тексте:
#include <iostream> #include <string> int main() { std::string text {"A friend in need is a friend indeed."}; std::string word {"endless"}; // поиск с 10-го индекса 3 первых символов слова "endless", то есть "end" std::cout << text.find("endless", 10, 3) << std::endl; // 25 }
Стоит отметить, что в этом случае искомая строка должна представлять строковый литерал или строку в С-стиле (например, символьный массив с концевым нулевым байтом).
Функция rfind. Поиск в обратном порядке
Функция rfind() работает аналогично функции find()
, принимает те же самые параметры, только ищет подстроку в обратном порядке — с конца строки:
#include <iostream> #include <string> int main() { std::string text {"A friend in need is a friend indeed."}; std::cout << text.rfind("ed") << std::endl; // 33 std::cout << text.rfind("friend") << std::endl; // 22 std::cout << text.rfind('d') << std::endl; // 34 std::cout << text.rfind("apple") << std::endl; // 18446744073709551615 }
Поиск любого из набора символов
Пара функций — find_first_of() и find_last_of() позволяют найти соответственно первый и последний индекс любого из набора символов:
#include <iostream> #include <string> int main() { std::string text {"Phone number: +23415678901"}; std::string letters{"0123456789"}; // искомые символы std::cout << text.find_first_of(letters) << std::endl; // 15 std::cout << text.find_last_of(letters) << std::endl; // 25 }
В данном случае ищем в строке «Phone number: +23415678901» первую и последнюю позицию любого из символов из строки «0123456789». То есть таким образом мы найдем начальный и конечный индекс
номера телефона.
Если нам, наоборот, надо найти позиции символов, которые НЕ представляют любой символ из набора, то мы можем использовать функции find_first_not_of() (первая позиция)
и find_last_not_of() (последняя позиция):
#include <iostream> #include <string> int main() { std::string text {"Phone number: +23415678901"}; std::string letters{"0123456789"}; // искомые символы std::cout << text.find_first_not_of(letters) << std::endl; // 0 std::cout << text.find_last_not_of(letters) << std::endl; // 14 }
Мы можем комбинировать функции. Например, найдем количество слов в строке:
#include <iostream> #include <string> int main() { std::string text {"When in Rome, do as the Romans do."}; // исходный текст const std::string separators{ " ,;:."!?'*n" }; // разделители слов unsigned count{}; // счетчик слов size_t start { text.find_first_not_of(separators) }; // начальный индекс первого слова while (start != std::string::npos) // если нашли слово { // увеличиваем счетчик слов count++; size_t end = text.find_first_of(separators, start + 1); // находим, где кончается слово if (end == std::string::npos) { end = text.length(); } start = text.find_first_not_of(separators, end + 1); // находим начальный индекс следующего слова и переустанавливаем start } // выводим количество слов std::cout << "Text contains " << count << " words" << std::endl; // Text contains 8 words }
Вкратце рассмотрим данный код. В качестве текста, где будем подсчитывать слова, определям переменную text. И также определяем строку разделителей, такие как знаки пунктуации, пробелы, символ перевода строки, которые не являются словами:
const std::string separators{ " ,;:."!?'*n" }; // разделители слов
Перед обработкой введенного текста фиксируем индекс первого символа первого слова в тексте. Для этого применяется функция find_first_not_of()
, которая возвращает
первый индекс любого символа, который не входит в строку separators:
size_t start { text.find_first_not_of(separators) };
Далее в цикле while
смотрим, является ли полученный индекс действительным индексом:
while (start != std::string::npos)
Например, если в строке одни только символы из набора separators, тогда функция find_first_not_of()
возвратит значение std::string::npos
,
что будет означать, что в тексте больше нет непунктационных знаков.
И если start указывает на действительный индекс начала слова, то увеличиваем счетчик слово. Далее находим индекс первого символа из separators, который идет сразу после слова. То есть фактически это индекс после
последнего символа слова, который помещаем в переменную end:
size_t end = text.find_first_of(separators, start + 1); // находим, где закончилось слово
Для нахождения позиции окончания слова используем функцию find_first_of()
, которая возвращает первую позицию любого символа из separators, начиная с индекса start+1
Причем может быть, что функция find_first_of()
не найдет ни одного символа из separators (например, слово является поседним в тексте, и после него нет никаких знаков пунктуации или пробелов),
в этом случае конечный индекс равен длине текста.
if (end == std::string::npos) // если НЕ найден ни один из символов-разделителей end = text.length(); // устанавливаем переменную end на конец текста
После того, как мы нашли начальный индексы слова и его конец, переустанавливаем start на начальный индекс следующего слова и повторяем действия цикла:
start = text.find_first_not_of(separators, end + 1); // находим начальный индекс следующего слова и переустанавливаем start
В конце выводим количество найденных слов.
Теги: java, string, символ, поиск, строка, метод, буква, знак, contains
В этой статье мы рассмотрим, как выполнять поиск букв и других символов в строке Java, а также как проверять, находится ли нужный символ, буква или слово в строке, начиная с указанного индекса.
Строкой в Java называют упорядоченную последовательность символов. Как правило строка в Java — это один из основных носителей текстовой информации.
Для работы со строками в Java применяют классы String, StringBuilder и StringBuffer. Класс String включает методы, возвращающие позицию символа либо подстроки в строке:
— indexOf() — для поиска с начала строки;
— lastIndexOf() — для выполнения поиска с конца строки.
Таким образом, если метод indexOf() найдёт заданную букву, символ либо строку, он вернёт индекс, то есть порядковый номер. Если не найдёт, будет возвращено -1. Также он позволяет искать символ или букву, начиная с указанного индекса.
Кроме того, стоит добавить, что класс String включает в себя ещё и метод contains, возвращающий true, когда в строке содержится заданная последовательность символов. Этот метод рекомендуется использовать лишь тогда, когда вам просто нужно узнать о существовании подстроки в строке, при этом позиция не имеет значения.
Метод indexOf()
Библиотека метода:
Синтаксис следующий:
public int indexOf(char ch) public int indexOf(char ch, int fromIndex)либо
public int indexOf(String s) public int indexOf(String s, int fromIndex)Соответственно, вызвать метод можно тоже несколькими способами:
int index = str1.indexOf(myChar); int index = str1.indexOf(myChar, start);или:
int index = str1.indexOf(myString); int index = str1.indexOf(myString, start);Представьте, что нам нужно отыскать в строке индекс первого вхождения требуемого символа/буквы, а также нужного слова. Как уже было сказано выше, метод indexOf() вернёт нам индекс первого вхождения, а в случае неудачи — вернёт -1.
Посмотрите на следующий код:
public class Main { public static void main(String[] args) { String str = "Otus — онлайн-образование"; int indexM = str.indexOf("з"); // Ищем символ в строке int indexJava = str.indexOf("онлайн"); // Ищем слово в строке if(indexM == - 1) { System.out.println("Символ "з" не найден."); } else { System.out.println("Символ "з" найден, его индекс: " + indexM); } if(indexJava == - 1) { System.out.println("Слово "онлайн" не найдено."); } else { System.out.println("Слово "онлайн" найдено, его индекс: " + indexJava); } } }Результат получим следующий:
Символ "з" найден, его индекс: 18 Слово "онлайн" найдено, его индекс: 7Метод contains
Бывают ситуации, когда нам необходимо проверить, содержит ли наша строка конкретный символ/букву либо слово. Нижеследующий Java-код продемонстрирует и этот пример:
public class Main { public static void main(String[] args) { String str = "Otus — онлайн-образование"; System.out.println("Слово "Otus" есть в строке str? Ответ: " + str.contains("Otus")); System.out.println("Символ "z" присутствует в строке str? Ответ: " + str.contains("z")); } }В этом случае результат будет следующим:
Слово "Otus" есть в строке str? Ответ: true Символ "z" присутствует в строке str? Ответ: falseКак видите, выполнять поиск букв и других символов в строке Java совсем несложно, и наши элементарные примеры убедительно это подтверждают. Если же вы хотите получить более продвинутые навыки по Java-разработке, добро пожаловать на наш курс:
Kaput 1 / 1 / 0 Регистрация: 28.10.2017 Сообщений: 28 |
||||
1 |
||||
31.05.2018, 21:20. Показов 25987. Ответов 3 Метки нет (Все метки)
Задана строка из слов, нужно найти конкретное слово. Есть ли для string библиотечная функция поиска слов с возвратом ее позиции?
0 |
7524 / 6391 / 2912 Регистрация: 14.04.2014 Сообщений: 27,828 |
|
31.05.2018, 21:21 |
2 |
find(). Справку открой.
0 |
1 / 1 / 0 Регистрация: 28.10.2017 Сообщений: 28 |
|
31.05.2018, 21:31 [ТС] |
3 |
find(). Справку открой. про find() я осведомлен, только вот в чем проблема:
0 |
igorrr37 2480 / 1907 / 951 Регистрация: 21.12.2010 Сообщений: 3,474 Записей в блоге: 10 |
||||
31.05.2018, 21:56 |
4 |
|||
Сообщение было отмечено Kaput как решение Решениеслова придётся вручную считать
1 |