Теги: 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-разработке, добро пожаловать на наш курс:
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
String.contains(String)
or String.indexOf(String)
– suggested
"abc".contains("Z"); // false - correct
"zzzz".contains("Z"); // false - correct
"Z".contains("Z"); // true - correct
"😀and😀".contains("😀"); // true - correct
"😀and😀".contains("😂"); // false - correct
"😀and😀".indexOf("😀"); // 0 - correct
"😀and😀".indexOf("😂"); // -1 - correct
String.indexOf(int)
and carefully considered String.indexOf(char)
with char to int
widening
"😀and😀".indexOf("😀".charAt(0)); // 0 though incorrect usage has correct output due to portion of correct data
"😀and😀".indexOf("😂".charAt(0)); // 0 -- incorrect usage and ambiguous result
"😀and😀".indexOf("😂".codePointAt(0)); // -1 -- correct usage and correct output
The discussions around character is ambiguous in Java world
can the value of char
or Character
considered as single character?
No. In the context of unicode characters, char
or Character
can sometimes be part of a single character
and should not be treated as a complete single character
logically.
if not, what should be considered as single character (logically)?
Any system supporting character encodings for Unicode characters should consider unicode’s codepoint as single character.
So Java should do that very clear & loud rather than exposing too much of internal implementation details to users.
String
class is bad at abstraction (though it requires confusingly good amount of understanding of its encapsulations to understand the abstraction 😒😒😒
and hence an anti-pattern
).
How is it different from general char
usage?
char
can be only be mapped to a character in Basic Multilingual Plane.
Only codePoint - int
can cover the complete range of Unicode characters.
Why is this difference?
char
is internally treated as 16-bit
unsigned value and could not represent all the unicode characters using UTF-16 internal representation using only 2-bytes
. Sometimes, values in a 16-bit
range have to be combined with another 16-bit
value to correctly define character.
Without getting too verbose, the usage of indexOf
, charAt
, length
and such methods should be more explicit. Sincerely hoping Java will add new UnicodeString
and UnicodeCharacter
classes with clearly defined abstractions.
Reason to prefer contains
and not indexOf(int)
- Practically there are many code flows that treat a logical character as
char
in java. - In Unicode context,
char
is not sufficient - Though the
indexOf
takes in anint
,char
toint
conversion masks this from the user and user might do something likestr.indexOf(someotherstr.charAt(0))
(unless the user is aware of the exact context) - So, treating everything as
CharSequence
(akaString
) is better
public static void main(String[] args) {
System.out.println("😀and😀".indexOf("😀".charAt(0))); // 0 though incorrect usage has correct output due to portion of correct data
System.out.println("😀and😀".indexOf("😂".charAt(0))); // 0 -- incorrect usage and ambiguous result
System.out.println("😀and😀".indexOf("😂".codePointAt(0))); // -1 -- correct usage and correct output
System.out.println("😀and😀".contains("😀")); // true - correct
System.out.println("😀and😀".contains("😂")); // false - correct
}
Semantics
char
can handle most of the practical use cases. Still its better to use codepoints within programming environment for future extensibility.codepoint
should handle nearly all of the technical use cases around encodings.- Still, Grapheme Clusters falls out of the scope of
codepoint
level of abstraction. - Storage layers can choose
char
interface ifint
s are too costly(doubled). Unless storage cost is the only metric, its still better to usecodepoint
. Also, its better to treat storage asbyte
and delegate semantics to business logic built around storage. - Semantics can be abstracted at multiple levels.
codepoint
should become lowest level of interface and other semantics can be built aroundcodepoint
in runtime environment.
Описание проблемы
Как найти символ или слово в строке?
Решение 1: когда нужно найти индекс первого вхождения
Следующий пример показывает как найти символ или слово в строке в Java с помощью метода indexOf(). Метод вернет индекс первого вхождения, если символ или слово не будет найдено, то метод вернет -1.
public class Example {
public static void main(String[] args) {
String str = "Привет, java-программист!";
int indexM = str.indexOf("м"); // Нахождение символа в строке
int indexJava = str.indexOf("java"); // Нахождение слова в строке
if(indexM == - 1) {
System.out.println("Символ "м" не найден.");
} else {
System.out.println("Символ "м" найден в индексе " + indexM);
}
if(indexJava == - 1) {
System.out.println("Слово "java" не найдено.");
} else {
System.out.println("Слово "java" найдено в индексе " + indexJava);
}
}
}
Результат
Получим следующий результат:
Символ "м" найден в индексе 19
Слово "java" найдено в индексе 8
Решение 2: когда нужно узнать есть ли в строке данный символ или слово
Ниже продемонстрирован пример, который позволяет в Java узнать присутствует ли данный символ или слово в строке.
public class Example {
public static void main(String[] args) {
String str = "Привет, java-программист!";
System.out.println("Слово "программист" есть в строке str? Ответ: " + str.contains("программист"));
System.out.println("Символ "б" присутствует в строке str? Ответ: " + str.contains("б"));
}
}
Результат
Получим следующий результат:
Слово "программист" есть в строке str? Ответ: true
Символ "б" присутствует в строке str? Ответ: false
Данная статья:
- написана командой Vertex Academy. Надеемся, что она Вам будет полезна. Приятного прочтения!
- это одна из статей из нашего “Самоучителя по Java”
Метод indexOf() в Java
Метод indexOf() ищет в строке заданный символ или строку, и их возвращает индекс (т.е. порядковый номер). Метод:
- возвращает индекс, под которым символ или строка первый раз появляется в строке;
- возвращает (-1) если символ или строка не найдены.
Метод также может искать символ или строку, начиная с указанного индекса.
Библиотека:
Синтаксис метода:
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); |
Пример 1:
public class Test { public static void main(String args[]) { String hello = “Hello”; int index1 = hello.indexOf(‘H’); int index2 = hello.indexOf(‘o’); int index3 = hello.indexOf(‘W’); System.out.println(“Мы ищем букву ‘H’ в строке “+hello+“. Индекс данной буквы “+index1 ); System.out.println(“Мы ищем букву ‘o’ в строке “+hello+“. Индекс данной буквы “+index2 ); System.out.println(“Мы ищем букву ‘W’ в строке “+hello+“. Индекс данной буквы “+index3 ); } } |
Если Вы запустите данный код на своем компьютере, в консоли Вы увидите следующее:
Комментарии к коду:
У нас есть строка “Hello”. С помощью метода indexOf мы искали индекс трех символов – ‘H’, ‘o’ и ‘W’.
- Символ ‘H’ стоит первым в строке. indexOf возвращает ноль.
- Символ ‘o’ стоит в конце строки. Получаем его индекс 4.
- Символ ‘W’ не встречается в строке “Hello”. Получаем (-1).
Пример 2:
public class Test { public static void main(String args[]) { String hello = “Hello”; int index1 = hello.indexOf(‘H’, 2); int index2 = hello.indexOf(‘o’, 2); int index3 = hello.indexOf(‘W’, 2); System.out.println(“Мы ищем букву ‘H’ в строке “+hello+” начиная с индекса номер 2. Индекс “+index1 ); System.out.println(“Мы ищем букву ‘o’ в строке “+hello+” начиная с индекса 2. Индекс “+index2 ); System.out.println(“Мы ищем букву ‘W’ в строке “+hello+” начиная с индекса 2. Индекс “+index3 ); } } |
Если Вы запустите данный код на своем компьютере, в консоли Вы увидите следующее:
Комментарии к коду:
У нас есть строка “Hello”. С помощью метода indexOf мы искали индекс трех символов – ‘H’, ‘o’ и ‘W’, но теперь начиная с символа под индексом 2.
- Символ ‘H’ стоит первым в строке. Но так как первые два символа в строке игнорируются, indexOf возвращает -1 (“символ не найден”).
- Символ ‘o’ стоит в конце строки. Он находится после второго символа, а значит функция его “видит”. Как и в прошлом примере, получаем 4.
- Символ ‘W’ не встречается в строке “Hello”. Как и в прошлом примере, получаем (-1).
Пример 3:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class Test { public static void main(String args[]) { String gm = “Good morning”; int index1 = gm.indexOf(“morni”); int index2 = gm.indexOf(“Vertex”); int index3 = gm.indexOf(“Good morning”, –2); int index4 = gm.indexOf(“Good morning”, 2); int index5 = gm.indexOf(“Good morning”, 999); System.out.println(“Мы ищем ‘morni’ в строке “+gm+“. Индекс “+index1 ); System.out.println(“Мы ищем ‘Vertex’ в строке “+gm+“. Индекс “+index2 ); System.out.println(“Мы ищем ‘Good morning’ в строке “+gm+” начиная с индекса -2. Результат: “+index3 ); System.out.println(“Мы ищем ‘Good morning’ в строке “+gm+” начиная с индекса 2. Результат: “+index4 ); System.out.println(“Мы ищем ‘Good morning’ в строке “+gm+” начиная с индекса 888. Результат: “+index5 ); } } |
Если Вы запустите данный код на своем компьютере, в консоли Вы увидите следующее:
Комментарии к коду:
Посмотрим, как метод ищет строки. У нас есть переменная “Good morning”. В ней мы ищем три подстроки: “morni”, “Vertex” и “Good morning”.
- “morni” – это часть строки “Good morning”. Первый символ найденной подстроки “morni” имеет индекс 5. Поэтому, в консоли получаем 5.
- “Vertex” в строке не встречается. Получаем -1;
- “Good morning” мы ищем три раза.
- Первый раз мы задавали отрицательный индекс (-2). Метод indexOf интерпретирует его как ноль (т.е. “искать с начала строки”). Поэтому, в консоли получаем индекс ноль – начало подстроки совпадает с началом основной строки.
- Во второй раз мы задаем значение 2. Фактически, теперь метод проверяет, встречается ли в строке “od morning” подстрока”Good morning”. Нет, не встречается. Получаем (-1) в консоли.
- В третий раз мы задаем значение, которое явно больше длины строки 888. Это как если бы мы искали что-то в пустой строке. Получаем (-1).
Данная статья написана Vertex Academy. Можно пройти наши курсы Java с нуля. Детальнее на сайте.