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 :

ArrayList de HashMap


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Par défaut ArrayList de HashMap
    Bonjour,
    je suis sur un projet de moteur de recherche en java.
    J'ai un fichier texte contenant 1400 documents (identifiés par ".I" et dont le body est identifié par ".W")

    Notre prof' nous a demandé de créer un ArrayList de HashMap pour répertorier chaque terme de chaque document.
    Donc je dois créer un ArrayList dont chaque case contient une HashMap, une par document du fichier texte.

    Chaque HashMap doit contenir un mot comme key, et le nombre de fois qu'on le rencontre comme value. Le problème est que je n'arrive pas à récupérer mes HashMaps...

    Voilà ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public static ArrayList createArrayOfHashtables() { //Those hashtables will be used to count each term in each document. 
    		String[] term = new String[1400];
    		ArrayList<HashMap<String,Double>> wordCountList = new ArrayList<HashMap<String,Double>>();
    		for (int i=1 ; i<1401 ; i++) {
    			wordCountList.add(new HashMap<String, Double>());
    		}
    		return wordCountList;
    	}
    Et lors de la lecture du fichier, pour chaque ligne :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    //dis.available() returns 0 if the file has no more lines. 
    while(dis.available() !=0) {
    	tmp = dis.readLine();
    	//For each document
    	if (tmp.startsWith(".I")) {
    		counter++;
    		String[] str = tmp.split(" ");
    		//System.out.println(str[1]+ " " + counter);
    		tab[counter] = Integer.parseInt(str[1]);
     
    	}
    	//Each time we find the body of the document
    	if (tmp.startsWith(".W")) {
    		//We split every word in str2
    		String[] str2 = tmp.split(" ");
    		HashMap<String, Double> tmp2 = (HashMap<String, Double>) wordCountList.get(counter);
    		int i=0;
    		//For each word in str2
    		while(i < str2.length) {
    			//We check if the value in str2 exists in the hashtable
    			for (int j=0 ; j<tmp2.size() ; j++) {
    				if (str2[i] == tmp2.get(str2[i])) {
    				}
    			}
    			tmp2.put(str2[i], (double) 0);
    			i++;
    		}
    	}
    	//System.out.println(dis.readLine());
    }

    J'obtiens cette erreur :
    Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1400, Size: 1400
    at java.util.ArrayList.RangeCheck(Unknown Source)
    at java.util.ArrayList.get(Unknown Source)
    at Main.readFile(Main.java:70)
    at Main.main(Main.java:15)
    En référence à la déclaration de tmp2, ligne 16 du 2e code.

    Donc pour en revenir à ma question, j'aimerai pouvoir comparer les termes splittés dans str2[] avec les keys de la HashMap correspondant au document que je traite. Et si ça correspond, j'aurais plus qu'à incrémenter la value, sinon, j'aurai juste à ajouter le mot comme key, et 1 comme value.

    Merci d'avance !!

  2. #2
    Membre éclairé
    Homme Profil pro
    NoOb
    Inscrit en
    Mai 2007
    Messages
    554
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : NoOb

    Informations forums :
    Inscription : Mai 2007
    Messages : 554
    Par défaut
    Bonjour,

    La réponse est dans le message d'erreur, c'est une liste de 1400 hashmap soit de 0 à 1399 et le problème c'est que tu demandes la 1400ième qui n'existe pas!

    IndexOutOfBoundException = "dépassement de la limite" ...

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    a noter cette correction qui rend le code plus souple et plus propre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public static List<Map<String,Double>> createArrayOfHashtables() { //Those hashtables will be used to count each term in each document. 
    		List<Map<String,Double>> wordCountList = new List<Map<String,Double>>();
    Aussi, pourquoi des double? Pour compter, on utilise des int ou des long en général

  4. #4
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Peut-être pour pouvoir faire évoluer le code : on compte si un mot est "presque" présent

  5. #5
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Ou si on applique de la pondération à virgule sur les termes ;-)
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  6. #6
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Par défaut
    Merci pour vos réponses, je vais tester tout ça !
    Pour les doubles, c'est parce qu'après j'ai besoin d'une hashmap avec des doubles comme values, mais dans celle là, pas besoin en effet.

  7. #7
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Citation Envoyé par buzza01 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public static ArrayList createArrayOfHashtables() { //Those hashtables will be used to count each term in each document. 
    		String[] term = new String[1400];
    		ArrayList<HashMap<String,Double>> wordCountList = new ArrayList<HashMap<String,Double>>();
    		for (int i=1 ; i<1401 ; i++) {
    			wordCountList.add(new HashMap<String, Double>());
    		}
    		return wordCountList;
    	}
    La variable term ne sert à rien. De manière générale, je n'aurais pas initialiser les 1400 maps d'un coup.

    Citation Envoyé par buzza01 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab[counter] = Integer.parseInt(str[1]);
    Utilise plutôt une liste qu'un tableau. Et profites à ce moment pour ajouter une nouvelle map dans ta liste. Genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Map<String, Double> counters = null;
    String line;
    while ( (line = dis.readLine()) != null)
    {
      if (line.startWith(".I"))
      {
        counters = new HashMap<String, Double>();
        wordCountList.add(counters);
      }
    }
    Citation Envoyé par buzza01 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (str2[i] == tmp2.get(str2[i]))
    Tu compares la référence d'une String avec celle d'un Double !
    Il faut utiliser la méthode "equals()" et corriger ton code ! Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    for (int i = 0; i < str2.length; i++)
    {
      Double count = counters.get(str2[i]);
      if (count != null)
      {
        count = Double.valueOf(0);
      }
      else
      {
        count = Double.valueOf(count.doubleValue() + 1);
      }
      counters.put(str2[i], count);
    }
    Sinon pourquoi utiliser un double ?
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

Discussions similaires

  1. HashMap et Arraylist : un peu perdu..
    Par flyzi dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 13/03/2009, 12h24
  2. fonction creant hashmap<String,ArrayList<String>
    Par sneb5757 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 08/02/2009, 10h56
  3. création de HashMap<ArrayList<String>, ArrayList<String>>
    Par Balbuzard dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 26/08/2008, 12h18
  4. Problème avec Hashmap et ArrayList!
    Par Angie73 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 11/05/2008, 21h31
  5. Passage d'une arraylist ou hashMap de jsp à javascript
    Par zako dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 21/02/2007, 14h08

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