Метод Java indexOf для нескольких совпадений в строке

У меня возник вопрос о методе indexOf. Я хочу найти несколько случаев "X" в строке.

Предположим, что моя строка «х есть х есть х есть х», я хочу найти х во всех его позициях индекса. Но как это сделать для нескольких случаев? Возможно ли это даже с indexOf?

Я сделал int temp = str.indexOf('x'); Он находит первый x. Я попытался выполнить цикл for, в котором i инициализируется длиной строки, и это не сработало, так как я снова и снова находил первый x.

for (int y = temp1; y >= 0;y-- ) 
{
    int temp = str.indexOf('x');
    System.out.println(temp);
}

Но это не работает. Я должен использовать регулярное выражение? Потому что я действительно не знаю, как использовать метод регулярных выражений.

Любая помощь будет оценена, спасибо!


person Eric    schedule 14.02.2011    source источник


Ответы (5)


Существует второй вариант метода indexOf, который принимает в качестве параметра начальный индекс.

i = str.indexOf('x');
while(i >= 0) {
     System.out.println(i);
     i = str.indexOf('x', i+1);
}
person Paŭlo Ebermann    schedule 14.02.2011
comment
Ах, большое спасибо всем. Это имеет большой смысл, поскольку вы просто перебираете строку в зависимости от позиции последнего совпадения. - person Eric; 14.02.2011

Существует еще одна версия метода indexOf, принимающая fromIndex в качестве параметра.
Таким образом, вы можете вызывать его в цикле, каждый раз передавая prevPosition + 1 в качестве второго параметра.

Документация:
http://download.oracle.com/javase/6/docs/api/java/lang/String.html#indexOf%28int,%20int%29

person Nikita Rybak    schedule 14.02.2011

Вы можете указать начальный индекс с помощью indexOf. Итак, в вашем цикле вы сохраняете последнюю позицию «x», а затем снова выполняете поиск, используя этот индекс + 1.

person Rob    schedule 14.02.2011

Вот решение с Streams API:

String text = "Lets search for E ?";

final char key = "e".charAt(0);
int[] indices = IntStream.range(0, text.length())
    .filter(i -> text.charAt(i) == key)
    .toArray();

Вывод будет таким:

//1
//6

Если вы хотите добавить заглавные буквы в свой результат, вам нужно изменить закрытие аргумента filter на:

.filter(i -> Character.toLowerCase(text.charAt(i)) == key)

Тогда вывод будет таким:

//1
//6
//16

Кроме того, если вы просто хотите использовать результаты или распечатать их для быстрого тестирования, вы можете сделать это с помощью операции терминала forEach:

IntStream.range(0, text.length())
    .filter(i -> text.charAt(i) == key)
    .forEach(System.out::println);
person Ömer Erden    schedule 11.06.2016

Вы хотите найти несколько символов в определенной строке. Да, вы можете это сделать. Вы можете использовать перегруженную версию метода indexOf. На веб-сайте подробно описаны все перегруженные версии методов indexOf.https://www.javaians.com/indexof-java/. Вы можете прочитать подробное руководство по методу Java indexOf.

person Jakki    schedule 03.04.2019
comment
Это кажется отличным, но пример кода был бы очень признателен. - person Julien; 03.04.2019