[Java]Besoin d'aide, anagrammes

Patajung Messages postés 3 Statut Membre -  
 quenti77 -
Bonjour à tous,

Je dois écrire une méthode qui, recevant 2 strings, str1 et str2, doit vérifier si les 2 sont anagrammes.

Je galère un peu et ne sait pas vraiment comment faire, qqun peut il m'aider svp ?
A voir également:

3 réponses

kij_82 Messages postés 4260 Statut Contributeur 857
 
Anagramme c'est bien des mots qui ont exactement les meme lettres, mais dans un ordre différent et qui donne donc un nouveau sens ?

Si oui, tu peux alors commencer par te faire une méthode qui trouve un caractère dans une chaine. Une fois cette méthode faite, il ne te reste plus qu'à regarder caractère par caractère dans ta premiere chaine si chacun de ces caractère se trouve dans la deuxieme. Si un de ces caractères n'est pas trouvé alors ce n'est pas un anagramme.
Par contre, une fois fait cela, tu te rends compte que lorsqu'il y a des lettres en double (ou plus), ca plante (et oui). Donc à ce moment là tu corse un peu plus ton truc en ajoutant le fait qu'il y ai un booléen attaché à chaque lettre, indiquant si dans ton parcours de lettre (recherche) tu es déjà passé dessus ou non.

Voilà, l'idée, à toi de la développer maintenant. Pour ce faire, je te conseil de te faire une classe Lettre ayant une propriété lettre et un booléen de passage, les méthodes adéquats.
Puis une classe pour ton algo (enfin une méthode à toi de voir ou la placer ensuite) qui fait dans cet ordre :
- création d'un tableau d'objet Lettre correspond à chaque lettre de ta premiere chaine de caractère à comparer.
- idem pour la deuxieme chaine
- une méthode qui pour chaque caractère du premier tableau, va essayer de le trouver dans le deuxième tableau et si oui, alors modifier la valeur du booléan pour la lettre du deuxieme tableau, de maniere a ne pas repasser dessus pour une autre lettre. Si tu ne trouve pas une lettre, ce n'est donc pas un anagramme donc tu arret ton programme là et retourne un message adéquat à l'utilisateur.
0
Patajung Messages postés 3 Statut Membre
 
Oui c'est bien ca un anagramme.

Je ne dois pas tenir compte de l'éventualité d'une lettre en double, on suppose que ce n'est pas le cas. Je dois également faire tout dans une seule méthode.

A preciser egalement, cette méthode doit etre suffisamment générale pour fonctionner avec n'importe quel mot, d'ailleurs on ne me les donne pas, juste str1 et str2.

Donc je dois faire 2 tableaux, un pour chaque string, dans lequel je met toutes les lettres présentes dans chaque mot ? Et ensuite comparer les 2 ?
0
kij_82 Messages postés 4260 Statut Contributeur 857
 
En gros oui.
Mais j'ai dit une connerie, pas besoin de mettre dans un tableau, tu as des méthodes pour la classe String qui te permettent de récupérér un char à un emplacement précis de ta string, regarde "charAt" ou un truc du genre.
0
kij_82 Messages postés 4260 Statut Contributeur 857
 
voilà un exemple, il me semble que ca correspond à ce que tu souhaite faire :
private boolean isAnagramme ( String str1, String str2 ){

                     boolean anagramme = true;
	int i = 0;
	// --- Vérifie que les caractères de la chaine 1 
                     // --- sont contenus dans la chaine 2
	while ( i < str1.length() && anagramme == true ){
		if ( str2.indexOf( str1.charAt(i) ) == -1 )
			anagramme = false;
		else  i++;
	}
	if ( anagramme == false )
		return anagramme;
			
	// --- Idem pour la chaine 2 dans la chaine 1
	anagramme = true;
	i = 0;
	while ( i < str2.length() && anagramme == true ){
		if ( str1.indexOf( str2.charAt(i) )  == -1 )
			anagramme = false;
		else i++;
	}

	return anagramme;
}


On fait le test 2 fois au cas ou la string 2 aie plus de caractère que la premiere, auquel cas il faut tester aussi pour elle.
0
bumblebee
 
euh oui mais je dirais que si les longueurs des chaines sont différentes, ce ne sont pas des anagrammes, si ?
Un petit test pour comparer les longueurs au début de la méthode, et on ne fait qu'une fois la boucle de traitement... ^^
0
Patajung Messages postés 3 Statut Membre
 
non effectivement, il faut mettre un

if(str1.length()==str2.length()) au début, car deux mots qui n'ont pas le meme nombre de caractères ne sont pas des anagrammes.

donc, le .indexOf () recherche l'indice ? et le -1 équivaut a un indice introuvable ?

Merci beaucoup pour votre aide !
0
kij_82 Messages postés 4260 Statut Contributeur 857
 
Ha ba dans ce cas oui, pas besoin de faire la deuxieme boucle, juste tester la longeur effectivement.
Sinon le indexOf == -1 correspond effectivement au fait que le caractère n'ai pas été retourné.

Par contre, il y a une chose que je ne comprends pas, c'est que normalement tu dois tester les lettres doubles etc... sinon ca ne marchera jamais ! Tu me dis que si mais tu n'as sans doute pas pris en compte le cas suivant :

mot1 = bateau
mot2 = aaaaaa

Avec le prog que tu demande, ces deux mots seront comptés comme des anagrammes, ce qui est loin d'etre le cas.
0
quenti77
 
le mieux c'est de trié la chaine comme ça on peut comparé caractère par caractère sans ce soucier de l'ordre et sans ce soucier des lettres en double.
0