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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 Expert

    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
    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 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    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 averti
    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
    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
    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
    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 émérite 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
    Par défaut
    Cherche "java trier map" (par exemple)... (par ailleurs ce n'est pas un tableau 2D)

  7. #7
    Membre averti
    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
    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.

+ 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