it-swarm-ru.tech

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

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

Предположим, что моя строка: «x - это x, это x - это 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);
}

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

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

18
Eric

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

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

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

Документация:
http://download.Oracle.com/javase/6/docs/api/Java/lang/String.html#indexOf(int, int)

10
Nikita Rybak

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

5
Rob

Для другого подхода здесь вы можете сделать это в 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);
2
Ömer Erden
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);
}
0
Alameer Kaiser