Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Java] Occurrence d'une chaîne, répétitif soucis

20 novembre 2013 à 11:46:21

Bonjour à tous.

Je suis débutant en Java, et je souhaite aujourd'hui compter l'occurrence des caractères d'une chaîne de caractère entré au clavier par l'utilisateur.

Cependant mon problème est le suivant : Quand j'exécute mon code ma fonction m'affiche bien le nombre d'occurrence de chaque caractères, mais il m'affiche également l'occurrence des caractères qui on déjà était compter.

Je m'expliquer, voici mon Code :

public static void compteurChar()
            {
              char ch;
              char test;
              String texte="";
              System.out.println("Entrez une phrase");
              texte = new Scanner(System.in).next();
              for (int y=0; y < texte.length(); y++)
                  {
                    ch=texte.charAt(y);
                    test=ch;
                    
                    int compteur=0;
                    for (int i=0; i < texte.length(); i++)
                        if (texte.charAt(i)==ch)
                            {
                            compteur++;
                            }
                            System.out.println("il y a "+compteur+" caractère pour le caractère "+ch);
                  } 
             }

Et voici le résultat de l'exécution :

run:
Entrez une phrase
salutation
il y a 1 caractère pour le caractère s
il y a 2 caractère pour le caractère a
il y a 1 caractère pour le caractère l
il y a 1 caractère pour le caractère u
il y a 2 caractère pour le caractère t
il y a 2 caractère pour le caractère a
il y a 2 caractère pour le caractère t
il y a 1 caractère pour le caractère i
il y a 1 caractère pour le caractère o
il y a 1 caractère pour le caractère n
GÉNÉRATION TERMINÉE (durée totale  3 secondes)

J'aimerai ici qu'il ne m'affiche qu'une fois l'occurrence des caractères, ici, il me dit qu'il y a 2 'a' mais il me le réafffiche une secondes fois au passage d'un second 'a'.

j'aimerai avoir un résultat de la forme :

run:
Entrez une phrase
salutation
il y a 1 caractère pour le caractère s
il y a 2 caractère pour le caractère a
il y a 1 caractère pour le caractère l
il y a 1 caractère pour le caractère u
il y a 2 caractère pour le caractère t
il y a 1 caractère pour le caractère i
il y a 1 caractère pour le caractère o
il y a 1 caractère pour le caractère n
GÉNÉRATION TERMINÉE (durée totale  3 secondes)



D'avance merci de me guider et ou de me proposer une modification de mon code.

-
Edité par Andujar 20 novembre 2013 à 11:49:50

  • Partager sur Facebook
  • Partager sur Twitter
20 novembre 2013 à 23:52:44

Quand tu comptes le nombre d'occurrences, tu stockes également le caractère, par exemple dans une ArrayList, et à chaque fois avant de compter les occurrences d'un caractère tu regardes dans cette liste si ce caractère a déjà été pris en compte ou non.
  • Partager sur Facebook
  • Partager sur Twitter
21 novembre 2013 à 11:44:41

Tu peux passer par une Map pour stocker les résultats, la clef correspondant au caractère et la valeur étant le nombre de caractères identiques détectés. (http://docs.oracle.com/javase/6/docs/api/java/util/Map.html)

Ensuite, tu affiches tous les couples présents dans la Map.

  • Partager sur Facebook
  • Partager sur Twitter

cd514331234507.564a1d2324e4e.gifCTO Co-fondateur @ My Talent Manager : boostez votre carrière d'artiste | https://mytalentmanager.fr

22 novembre 2013 à 22:54:41

Bonjour,

Fais une première boucle qui parcourt la chaine (tu devras utiliser la méthode atChar(int)). Chaque itération de cette boucle permet donc de "focus" (i.e. : "sélectionner") chaque caractère de la chaîne, caractère par caractère, jusqu'à la fin de la chaîne.

Dans chaque itération, tu devras également comparer ce caractère focused avec, une nouvelle fois (et toujours dans la même itération), chaque caractère de la chaîne, caractère par caractère, et jusqu'à la fin de la chaîne.

Il faudra donc deux boucles. La première correspond au premier paragraphe de ma réponse. La deuxième, au second. Cette dernière sera bien entendu imbriquée dans la première (i.e. : elle sera codée à l'intérieur du corps de la première). Le "corps d'une boucle" désigne le bloc d'instructions délimité par les accolades ("{}") de la boucle.

Essaie de chercher par toi-même. Inutile de te précipiter sur le code qui suit, et de faire un copier/coller ! Si tu veux progresser, il te faut réfléchir un minimum.

Voici le code :

public class occurrences {

	
	public static void main(String[] args) {
			String chaine = new String("Salutations !");
			
			compterOccurences(chaine);
	}
	
	public static void compterOccurences(String chaineChoisie) {	
			for (int i = 0; i < chaineChoisie.length(); i++) {
			int nombreOccurrencesCharActuel = 0;
			
			for (int j = 0; j < chaineChoisie.length(); j++) {
				if (chaineChoisie.charAt(i) == chaineChoisie.charAt(j))
					nombreOccurrencesCharActuel++;
			}
			
			System.out.println("Le caractère " + chaineChoisie.charAt(i) + " apparaît " + nombreOccurrencesCharActuel + " fois.");
		}
	}
		
}


Avec en prime un résultat d'exécution :

Le caractère S apparaît 1 fois.
Le caractère a apparaît 2 fois.
Le caractère l apparaît 1 fois.
Le caractère u apparaît 1 fois.
Le caractère t apparaît 2 fois.
Le caractère a apparaît 2 fois.
Le caractère t apparaît 2 fois.
Le caractère i apparaît 1 fois.
Le caractère o apparaît 1 fois.
Le caractère n apparaît 1 fois.
Le caractère s apparaît 1 fois.
Le caractère   apparaît 1 fois.
Le caractère ! apparaît 1 fois.




-
Edité par Nohak_ 22 novembre 2013 à 23:00:33

  • Partager sur Facebook
  • Partager sur Twitter
Étudiant en informatique | Baccalauréat : fiches de révision de Physique et de Chimie | Très bon tuto d'initiation à PL/SQL
18 février 2020 à 16:50:12 - Message modéré pour le motif suivant : Merci d'utiliser le bouton code du forum pour insérer votre code


18 février 2020 à 18:07:21

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter