Rechercher : dans
Par :

[Java]Besoin d'aide, anagrammes

Dernière réponse le 4 jan 2007 à 16:35:30 Patajung, le 2 jan 2007 à 16:38:59 
 Signaler ce message aux modérateurs

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 ?

Configuration: Windows XP
Internet Explorer 6.0

1

kij_82, le 2 jan 2007 à 16:55:00

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. ~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~

Répondre à kij_82

2

Patajung, le 2 jan 2007 à 17:08:04

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 ?

Répondre à Patajung

3

kij_82, le 3 jan 2007 à 11:30:47

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.
~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~

Répondre à kij_82

4

kij_82, le 3 jan 2007 à 11:42:13

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. ~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~

Répondre à kij_82

5

bumblebee, le 4 jan 2007 à 10:22:34

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... ^^

Répondre à bumblebee

6

Patajung, le 4 jan 2007 à 10:38:52

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 !

Répondre à Patajung

7

 kij_82, le 4 jan 2007 à 16:35:30

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. ~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~

Répondre à kij_82