Excusez-moi, pourquoi une fois que la boucle while de ce code entre dans la partie arrière de else, la boucle while suivante ne peut plus entrer dans la première moitié de la branche ? Je pense que la condition après le if doit être satisfaite. Le résultat en cours ne peut pas être rompu car il ne peut pas entrer dans la première boucle. Demander conseil à Dieu :
classe publique SearchString {
public static void main(String[] args) {
String s1 = "abcaaaaaaaabcabc";
String s2 = "abc";
int len = s2.length();
int pos = 0;
int count = 0;
while (true) {
if (s1.indexOf(s2, pos) == -1) {
System.out.println("Search Over, result count=" + count);
break;
} else {
System.out.println("Position" + (count + 1) + " is " + pos);
int a = pos + len;
pos = s1.indexOf(s2, a);
count++;
}
}
}
}
Le résultat courant est -1 10 13 -1 10 13, une boucle infinie
Étant donné que le résultat ne peut pas être égalé lors de la troisième requête, la valeur renvoyée est -1. Si le deuxième paramètre de indexOf() est inférieur à 0, il sera traité comme 0.
Le premier cycle recommence donc.
Vous pouvez déboguer avec des points d'arrêt, le résultat sera très clair
Lorsque vous entrez dans la deuxième boucle, else est entré et pos devient 13. La boucle suivante, c'est-à-dire qu'en entrant dans la troisième boucle, elle entre toujours autrement.
Cette fois, a devient 16 dans else, et pos vaut -1. Dans la boucle suivante, s1, indexOf(s2, pos) vaut 0, et il entre toujours else, donc une boucle infinie est générée.
Je pense que vous n'avez pas besoin de changer de position à chaque fois, mais d'intercepter directement la seconde moitié de la chaîne s1.