web-dev-qa-db-fra.com

Méthode Java indexOf pour plusieurs correspondances dans String

J'ai eu une question sur la méthode indexOf. Je veux trouver plusieurs cas de "X" dans une chaîne.

Supposons que ma chaîne est "x est x est x est x", je veux trouver x dans toutes ses positions d'index. Mais comment faites-vous cela pour plusieurs cas? Est-ce même possible avec indexOf?

J'ai fait int temp = str.indexOf ('x'); Il trouve le premier x. J'ai essayé de faire une boucle for où i est initialisé à la longueur de la chaîne et cela n'a pas fonctionné car je n'arrêtais pas de trouver le premier x à plusieurs reprises.

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

Mais ça ne marche pas. Suis-je censé utiliser regex? Parce que je ne sais pas vraiment comment utiliser la méthode regex.

Toute aide serait appréciée Merci!

18
Eric

Il existe une deuxième variante de la méthode indexOf, qui prend un index de début en tant que paramètre.

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

Il existe une autre version de la méthode indexOf, prenant fromIndex en paramètre.
Vous pouvez donc l'appeler en boucle, en passant chaque fois prevPosition + 1 en tant que deuxième paramètre.

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

10
Nikita Rybak

Vous pouvez spécifier l'index de démarrage avec indexOf . Ainsi, dans votre boucle, vous stockez la dernière position de 'x', puis effectuez une nouvelle recherche en utilisant cet index + 1.

5
Rob

Pour une approche différente, vous pouvez le faire en Java 8 avec des flux 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

si vous voulez trouver la lettre majuscule "E" avec la lettre minuscule "e", vous pouvez simplement changer l'argument du filtre avec:

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

la sortie sera:

//1
//6
//16

De plus, si vous ne voulez pas collecter dans un tableau si vous voulez simplement l'imprimer à des fins de test rapide, vous pouvez le faire avec: 

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