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

Java Discussion :

Comparer plusieurs fichiers


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 57
    Par défaut Comparer plusieurs fichiers
    Bonjour tout le monde,

    j'ai un ensemble de fichiers contenant chacun un mot par ligne je voulais comparer ces fichiers afin de voir le mots qui existe dans la majorité des fichiers
    quelqu'un pourrais me proposer une méthode ou un algorithme??
    Merci d'avance.

  2. #2
    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
    A priori, lire tous les fichiers l'un après l'autre, de sorte de construire une HashMap indexée par les mots, qui indique dans combien de fichiers apparaît ce mot.

    Et à la fin tu regardes lequel apparaît dans le plus grand nombre.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 57
    Par défaut
    j'ai effectué la lecture de mes fichiers mais j'ai pas une idée sur la Hash map pourriez vous me dire de quoi s'agit il et comment puisse je l'appliquer pour indexer mes fichiers

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    une Map (et dont HashMap est une implémentation particulière) est une classe qui permet d'associer des clefs avec des valeurs indéxées sur ces clefs.

    Ce que dit @thelvin c'est d'utiliser en clef les mots et de leur associer un compteur de fichier, ce qui te permettra ensuite de connaitre le nombre de fichiers qui stockent chaque mot, et donc de connaitre ceux qui sont stockés dans le plus grand nombre de fichier (ou toutes autres conditions que tu entends par "majorité de fichier").

    Tu vas donc utiliser une map dont les clefs sont des mots (donc des String) et les valeurs de compteurs, donc des Integer (qui devrait être suffisant pour stocker un nombre de fichiers conséquents)

    Pour créer ta map :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<String, Integer> map = new HashMap<String, Integer>();
    Ensuite, en gros tu vas avoir :

    Chaque fois que tu lis un mot dans un fichier, tu fais quelque chose comme ça (en supposant qu'un mot se trouve qu'une seule fois dans chaque fichier) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if ( map.contains(mot) ) { // si la map indexe déjà le mot
         map.put(mot, map.get(mot) + 1); // incrémenter le compteur associé
    } else { // le mot n'a jamais été encore compté puisqu'il n'est pas encore dans la map
         map.put(mot, 1); // ajouter le mot dans la map et le compter 1 fois 
    }
    Ensuite, tu peux lire les valeurs dans ta map pour déterminer par exemple ceux qu'on retrouve le plus grand nombre de fois par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int max=0;
    for(Integer valeur : map.values()) { // on parcourt tous les compteurs
       if( valeur>max ) max = valeur; // si la valeur est supérieur au max courant, c'est qu'elle est forcément plus possiblement le max;
    }
    // maintenant dans max on a forcément la plus grande des valeurs, c'est à dire le plus grand nombre de fichiers qui contient un même mot
    Puis chercher dans ta map les mots dont le compteur associé est égal au max trouvé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for(Map.Entry<String, Integer> entry : map.entrySet()) { // on parcourt toutes les entrées (comprends associations clef-valeur)
     
        if ( entry.getValue()==max ) { // si cette entrée  est égale au max
          String mot = entry.getKey(); // on lit le mot correspondant au compteur qui est égal au max
           // le mot contenu dans la variable mot est un mot contenu dans un nombre de fichier qui correspond au plus grand nombre de fichier qui stocke un même mot
          // et là tu fais ce que tu veux avec ce mot
          // tu le stocke dans une liste, tu l'affiches, tu l'écris dans fichier, que sais-je ... 
        }
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 57
    Par défaut
    Merci infiniment un grand merci vraiment
    mais je voulais savoir si je pourrais avoir les 5 mots ayant les valeurs max c'est à dire les 5 premiers qui apparaissent dans la majorités des fichiers

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par mimihh Voir le message
    Merci infiniment un grand merci vraiment
    pas de quoi
    Citation Envoyé par mimihh Voir le message
    mais je voulais savoir si je pourrais avoir les 5 mots ayant les valeurs max c'est à dire les 5 premiers qui apparaissent dans la majorités des fichiers
    Dans la map, à la fin, tu as tous les comptes, donc tu peux oui.

    Par exemple, tu cherches d'abord les 5 valeurs max : tu peux par exemple trier les valeurs de la map en ordre décroissant et prendre les 5 premières (tu peux faire ça par exemple en mettant les valeurs (map.getValues()) dans un TreeSet avec un comparateur (java.util.Comparator) qui tri en décroissant...

    Le TreeSet va garantir qu'en plus chaque valeur de compteur ne figure qu'une seule fois

    quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Set<Integer> plusgrandaupluspetitSet = new TreeSet<Integer>(new Comparator<Integer>() { 
                            public int compare(Integer i1, Integer i2) {
                                return -i1.compareTo(i2); // -1 pour avoir l'ordre décroissant
                           }
    )};
    plusgrandaupluspetitSet.addAll(map.values()); // on met dans ce TreeSet tous les compteurs se trouvant dans la map
    Ensuite : tu parcours ce treeset avec un compteur de mots (qui ne doit pas dépasser 5 donc) :

    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
    int maxmot=0;
    for(Iterator<Integer> iter = plusgrandaupluspetitSet.iterator(); maxmot<5 && iter.hasNext(); ) { // on parcourt les compteurs du plus grand au plus petit, en se limitant à 5 mots max
       int max=iter.next();
       // la on fait exactement pareil qu'avant, mais en veillant à ne pas dépasser 5 mots max
       for(Iterator<Map.Entry<String, Integer>> entryIter = map.entrySet().iterator(); maxmot<5 && entryIter.hasNext();) { // on parcourt toutes les entrées (comprends associations clef-valeur) en se limitant à 5 mots max
     
           Map.Entry<String, Integer> entry = entryIter.next();
           if ( entry.getValue()==max ) { // si cette entrée  est égale au max
                String mot = entry.getKey(); 
     
          ... 
     
               maxmot++; // on compte ce mot
          }
          // ici on va reboucler alors qu'on est sûr d'avoir bien sélectionné tous les mots (mais pas plus de 5 en tout) qui se trouvait dans "max" fichiers..., 
       }
     
    }
    On pourrait également trier la map en ordre décroissant sur les compteurs (il faut rendre map final), mais je sais pas , j'aime moins cette solution :

    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
    Map<String, Integer> maptriee = new TreeMap<String, Integer>(new Comparator<String>() {
         public int compare(String mot1, String mot2) {
             Integer compteurmot1=map.get(mot1);
             Integer compteurmot2=map.get(mot2);
             return -compteurmot1.compareTo(compteurmot2); 
         }
    });
    maptriee.putAll(map); // on mets toutes les associations de map dans maptriee
    //puis prendre les 5 premières valeurs :
    int maxmot=0;
    for(String mot : maptriee.keySet()) {
         ...
         maxmot++;
         if ( maxmot==5 ) break; // on a trouvé 5 mots, on s'arrête
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/03/2013, 12h39
  2. [XL-2003] Comparer des vecteurs dans plusieurs fichiers
    Par leo_nic dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/11/2012, 17h07
  3. grep extraire plusieurs termes en comparant plusieurs fichiers entre eux
    Par sab113 dans le forum Shell et commandes GNU
    Réponses: 14
    Dernier message: 07/03/2012, 19h03
  4. [Batch] Comparer la somme de plusieurs fichiers
    Par jobar38 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 21/02/2011, 11h04

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