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

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

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

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

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

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

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

5 ответов


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

i = str.indexOf('x');
while(i >= 0) {
     System.out.println(i);
     i = str.indexOf('x', i+1);
}

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

Documentation:
http://download.oracle.com/javase/6/docs/api/java/lang/String.html#indexOf(int, int)


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


для другого подхода здесь вы можете сделать это в java 8 с 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();
//output 
//1
//6

если вы хотите найти букву верхнего регистра " E "с буквой нижнего регистра" e", вы можете просто изменить аргумент фильтра с помощью :

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

выход будет:

//1
//6
//16

кроме того, если вы не хотите собирать в массив, если вы просто хотите распечатать его для быстрого тестирования, вы можете сделать это с:

IntStream.range(0, text.length())
         .filter(i -> text.charAt(i) == key)
         .forEach(System.out::println);

String name = "alameer kaiser aziz";
String found = "a";
int num = name.indexOf(found);
while (num >=0) {
    System.out.println(num);
    num = name.indexOf(found,num+1);
}