IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Tableau Dynamique 2D String & Integer


Sujet :

Collection et Stream Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 29
    Points : 24
    Points
    24
    Par défaut Tableau Dynamique 2D String & Integer
    Bonjour !
    Je voudrais faire un programme qui sépare les mots de plusieurs phrases et qui compte le nombre de fois que chaque mot est apparu pour ensuite en faire un classement.
    Par exemple :
    "manger" 16 fois
    "faire" 12 fois
    "pomme" 8 fois
    J'arrive déjà à le faire à l'aide de deux ArrayLists, une pour les mots et une pour le nombre de fois que chaque mot est apparu. Le problème est que pour faire un classement ensuite, jutilise beaucoup d'indexOf, de get, ect... Et c'est assez "fouillis".
    Je me demande donc si il y a un autre moyen plus simple et plus pratique de faire ça.
    J'ai vue les HashMap mais ce n'est pas vraiment ce que je cherche ou alors je n'ai pas compris comment les utiliser.

    Merci de votre aide.

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 974
    Points : 1 825
    Points
    1 825
    Par défaut
    Map<String, int> mots = new HashMap<>();


    les mots trouvés forment les clés (de type String)
    Leur occurrence forme la valeur (de type int).

    A chaque fois que tu trouves un mot:
    Si il est dans la map (mots.containsKey('le mot')), tu incrémentes sont occurrence
    Sinon, mots.put('nouveau mot', 1);

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    L'idée est là, mais Map<String, int> ça ne compile pas.

    C'est
    Les types de base ne peuvent pas servir de générique.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    Merci, j'ai réussi, c'est vrai que c'est beaucoup plus simple comme ça.
    Le problème c'est que je ne trouve pas comment récupérer les 3 mots ayant les 3 plus grandes keys de la HashMap et les trier par ordre décroissant, comment je peux faire ?

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    1. Tu te crées une classe représentant tes données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public class WordInfo {
        private final String word;
        private int count;
     
        public WordInfo(String word) {
            this.word = word;
            this.count = 0;
        }
     
        public String getWord() {
             return this.word;
        }
     
        public int getCount() {
            return this.count;
        }
     
        public void increment() {
            this.count++;
        }
    }

    2. Tu utilises une Map<String,WordInfo> pour remplir ta Map (cela sera plus simple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Map<String,WordInfo> map = ...
    String word = ...
     
    // pour ajouter un mot :
    WordInfo nfo = map.get(word);
    if (nfo==null) {
        // S'il n'est pas présent on l'ajoute (vide) :
        nfo = new WordInfo(word);
        map.put(word, nfo);
    }
    // Et on incremente le nombre d'apparence :
    nfo.increment();

    3. Une fois que tu as fini de récolter les valeurs, tu mes le contenu dans une List que tu pourras trier comme bon te semble :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    List<WordInfo> list = new ArrayList<>(map.values());
     
    Collections.sort(list, new Comparator<WordInfo>() {
        @Override
        public void compare(WordInfo w1, WordInfo w2) {
            return Integer.compare(w1.getCount(), w2.getCount());
        }
    });


    a++

  6. #6
    Membre éclairé Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Points : 803
    Points
    803
    Par défaut
    Cherche "java trier map" (par exemple)... (par ailleurs ce n'est pas un tableau 2D)
    Sans danger si utilisé conformément au mode d'emploi.

    (anciennement BenWillard, enfin moins anciennement que ... enfin bon c'est une longue histoire... Un genre de voyage dans le temps...)

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    C'est bon, j'ai trouvé merci à tous.
    Une dernière petite question. J'arrive donc à avoir ma liste de mots triés, je voudrais maintenant récupérer les 3 premiers mots de cette liste. Le seul moyen que j'ai trouvé, qui marche mais que je trouve assez "moche" est celui là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    String[] classement = new String[3];
    		int i = 0;
     
    		for (Entry <String, Integer> entry : wordsSorted.entrySet()) {
    			classement[i] = "\"" + entry.getKey() + "\" : " + entry.getValue() + " fois.";
    			i++;
    			if(i > 2) break;
    		}
    Auriez-vous un autre moyen ? J'ai l'impression de me compliquer la vie pour rien, c'est pour ça que je demande.

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Je vois un appel à entrySet() et je ne vois pas de List. Ça ne ressemble pas à la solution proposée par adiGuba, et un "meilleur moyen" passe par elle.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    C'est bon, parfait. Désolé pour la dernière question c'est vrai que je n'avais pas fait la méthode que adiGuba proposé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/03/2015, 18h31
  2. tableau dynamique de string
    Par alaninho dans le forum C++
    Réponses: 4
    Dernier message: 03/10/2012, 15h00
  3. Tableau dynamique et manipulation de string
    Par cinou01 dans le forum C#
    Réponses: 5
    Dernier message: 24/10/2009, 11h02
  4. [Kylix] tableau dynamique
    Par sdoura2 dans le forum EDI
    Réponses: 1
    Dernier message: 31/10/2002, 08h57
  5. Réponses: 4
    Dernier message: 13/05/2002, 16h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo