*** comtage d'un groupe de caractèeres dans une chaîne.

Résolu
JMBeaucoup Messages postés 16 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 24 juin 2009 - 23 juin 2009 à 19:08
 Utilisateur anonyme - 24 juin 2009 à 18:01
Bonsoir,
je veux compter combien j'ai de $20 dans une chaîne mais
j'ai un problème de taille mais je ne vois pas pourquoi car normalement ça devrai rentrer :)
si quelqu'un a une petite idée...
merci.

voici mon message d'erreur:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 32
at java.lang.String.charAt(Unknown Source)
at test.test1(test.java:32)
at test.main(test.java:7)

et bien sur, voici mon code:
public class test
{

public static void main(String[] args)
{
test.test1();
}
public static void test1(){

String chaine = "CMD$20Consigne$20En$20En$20Cours";
int longueurChaine = chaine.length();
System.out.println("longueurChaine: "+longueurChaine);

int caractDejaLu = 0;
int $20 = 0;
int quatre = 4;
char caract1 = 0;
char caract2 = 0;
char caract3 = 0;
char $='$';
char deux='2';
char zero='0';

while(caractDejaLu<longueurChaine){

caract1 = chaine.charAt(caractDejaLu);
System.out.println("La variable caract1 à pour valeur: "+caract1);
caract2 = chaine.charAt(caractDejaLu+1);
System.out.println("La variable caract2 à pour valeur: "+caract2);
caract3 = chaine.charAt(caractDejaLu+2);
System.out.println("La variable caract3 à pour valeur: "+caract3);

caractDejaLu++;

if((caract1==$) && (caract2==deux) && (caract3==zero)){

$20++;
System.out.println("La variable $20 à pour valeur: "+$20);

}
}
System.out.println("On est apres le while.");

if($20==quatre){
System.out.println("La variable $20 à pour valeur: "+$20);
System.out.println("On poursuit avec le code...");
}
else{
System.out.println("On passe la série de test.");
}
}
}

3 réponses

Utilisateur anonyme
24 juin 2009 à 08:18
Salut,

Tout d'abord (dans la boucle) tu lis 3 caractères, mais tu additionnes seulement 1 à caractDejaLu (caractDejaLu++; )  alors qu'íl faudrait faire +3 (caractDejaLu+=3; )
Ensuite étant donné qu'avant le $20 suivant tu n'as que 2 caractères alors que tu vas en lire 3, tu laisse passer le $20 suivant...

Je vais te conseiller d'utiliser (par exemple)   int index indexOf(String str)  str sera "$20",
S'il n'y a pas (ou plus) de "$20" index = -1. Ce sera la condition de ta boucle:  while
(ind != -1){

Mais tu dois travailler avec une copie de ta chaîne car par la suite tu vas devoir supprimer ce qu'il y a du début jusqu'au $20 (compris) que tu as trouvé pour rechercher le "$20" et tant qu'à faire ne pas détruire la chaîne initiale.
Comment: en utilisant String substring(int indice début, int indice fin). Dans notre cas ,int indice fin n'est pas nécessaire puisque qu'on garde ce qu'il reste jusqu'à la fin de la chaîne.

Regardes ces 2 méthodes et n'hésites pas à poser des questions si besoin est.

Cordialement,

...\ Dan /...

Ps,
Tu peux également regarder la classe StringTokenizer...
3
JMBeaucoup Messages postés 16 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 24 juin 2009
24 juin 2009 à 13:43
merci Dan,
c'est vrai que ton histoire fait tout de suite plus pro ;)

Voici ma solution:

String chaine = "CMD$20CMD$20Consigne$20En$20En$20Cours";
String str = "$20";
int count = 0;
int index = chaine.indexOf(str);
while (index != -1) {
count++;
index = chaine.indexOf(str, index+1);
}

System.out.println("Nbre d'occurrences de '$20' : " +count);
0
Utilisateur anonyme
24 juin 2009 à 18:01
Salut,

C'est même mieux sans substring !!!

...\ Dan /...
0
Rejoignez-nous