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

Entrée/Sortie Java Discussion :

Remplir une Arraylist à partir d'un fichier csv


Sujet :

Entrée/Sortie Java

  1. #41
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Sara_hda Voir le message
    Je vois d'où viens l'erreur, les 5 premières lignes du fichier en question concerne le titre, je devrai surement commencer l'annalyse du fichier à la ligne 6 non ?
    Oui.

    Citation Envoyé par Sara_hda Voir le message
    Tout de même lorsque j'écris cela : population = champLine2[1]; ca me met la même erreur, il ne devrait pas s'afficher "Population 2015" ??
    Ça peut être la même erreur mais pas sur la même ligne : si tu as 6 lignes au début du fichier qui n'ont pas le même format que les autres, peut-être n'ont-elles pas chacune au moins 2 champs.
    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.

  2. #42
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 52
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Oui.


    Ça peut être la même erreur mais pas sur la même ligne : si tu as 6 lignes au début du fichier qui n'ont pas le même format que les autres, peut-être n'ont-elles pas chacune au moins 2 champs.
    Oui l'erreur venait bien de là ! Merci beaucoup !!

  3. #43
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 52
    Points : 3
    Points
    3
    Par défaut
    Voilà que j'ai de nouveau une erreur lors de l'execution dans ma classe List, la console affiche ceci :

    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Unknown Source)
    at java.util.Arrays.copyOf(Unknown Source)
    at java.util.ArrayList.grow(Unknown Source)
    at java.util.ArrayList.ensureExplicitCapacity(Unknown Source)
    at java.util.ArrayList.ensureCapacityInternal(Unknown Source)
    at java.util.ArrayList.add(Unknown Source)
    at world.WorldList.<init>(WorldList.java:61)

    La ligne correspondante est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    countries.add(country);
    L'erreur apparait une bonne minute après le lancement du programme.. C'est assez long quand meme non ?
    J'ai regardé un peu sur internet, il est dit que ce serait du soit à une trop grande utilisation de la mémoire, ou que le tableau est trop petit..
    Mais je ne pense pas que ce soit l'une de ses deux raisons puisque j'utilise une Arraylist, qui est tableau dynamique donc pas trop petit, et pour l'utilisation de la mémoire, y a quoi 250 pays à peu près, ce n'est pas énorme non ?

  4. #44
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Non, ce n'est pas parce que le "tableau est trop petit" (ça n'a rien à voir). L'erreur dit que qu'il n'y a pas assez de mémoire pour faire le traitement. Mais le problème se situe probablement ailleurs, surtout s'il n'y a que 250 pays et ça dure 1 minute en plus avant que tu aies le message. Je dirais que tu as plutôt une boucle infinie qui ajoute sans arrêt des éléments dans la liste jusqu'à ce que la mémoire ne soit plus suffisante. Sans code je ne peux pas en dire plus.
    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. #45
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 52
    Points : 3
    Points
    3
    Par défaut
    Voici la partie du code
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    	try {
    			File f1 = new File(fichier1);
    			File f2 = new File(fichier2);
    			File f3 = new File(fichier3);
     
    			br1 = new BufferedReader (new FileReader(f1));
    			br2 = new BufferedReader (new FileReader(f2));
    			br3 = new BufferedReader (new FileReader(f3));
     
     
    			String line1 = null;
    			String line2 = null;
    			String line3 = null;
     
     
     
    			while ((((line1 = br1.readLine())!= null)) && ((line2 = br2.readLine())!=null) && ((line3 = br3.readLine())!=null)){
     
    				String[] champLine1 = line1.split(","); // je lis les champs dans le fichier 1 (séparés par des virgules)
    				String[] champLine2 = line2.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");	
    				String[] champLine3 = line3.split("\t"); // je lis les champs dans le fichier 3 (séparés par des tab)
     
                                    while (champLine2[0] != null ){
     
    					Country country = new Country(countryName,population,surface);
     
    					countryName = champLine1[0]; // le pays est en première position
     
    					if (line2.contains(countryName)){
    					population = champLine2[1];
    					}
    					if (line3.contains(countryName)){
    						surface = champLine3[2];
    					}
    					countries.add(country);
     
    				}
    			}
    		}
     
    		catch (Exception e){
    			e.printStackTrace();
    		}
    		finally {
     
    			try {
    				br1.close();
    			} catch (IOException e1) {
    				e1.printStackTrace();
    			}
    			try {
    				br2.close();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    			try {
    				br3.close();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
     
     
    		}
     
    	}

  6. #46
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    while (champLine2[0] != null ){ champLine2[0] ne change jamais dans le while, donc cette boucle est infine. Donc tu ajoutes indéfiniment des pays dans la liste, donc tu exploses la mémoire.

    Mais à quoi sert ce while ? Si le but est de ne pas ajouter un pays si champLine2[0] est null, il suffit de faire un if.

    Par ailleurs, ce qu'il y a dans ton while n'est pas logique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Country country = new Country(countryName,population,surface);
     
    countryName = champLine1[0]; // le pays est en première position
     
    if (line2.contains(countryName)){
       population = champLine2[1];
    }
    if (line3.contains(countryName)){
       surface = champLine3[2];
    }
    countries.add(country);
    Tu affectes tes variables après les avoir utilisées pour créer le pays : le pays sera donc créé avec les valeurs de la ligne précédente, sauf pour le premier qui sera créé avec les valeurs initiales, soit null, probablement.
    Il faut affecter les variables à passer au constructeur de Country avant d'appeler le constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    countryName = champLine1[0]; // le pays est en première position
     
    if (line2.contains(countryName)){
       population = champLine2[1];
    }
    if (line3.contains(countryName)){
       surface = champLine3[2];
    }
    Country country = new Country(countryName,population,surface);
    countries.add(country);
    Voire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    countryName = champLine1[0]; // le pays est en première position
     
    if (line2.contains(countryName)){
       population = champLine2[1];
    }
    if (line3.contains(countryName)){
       surface = champLine3[2];
    }
    countries.add( new Country(countryName,population,surface) );
    Pourquoi d'ailleurs utiliser des variables déclarées ailleurs ? Déclarer ses variables au plus proche de l'endroit où elles servent évite bien des déboires :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    String countryName = champLine1[0]; // le pays est en première position
     
    if (line2.contains(countryName)){
       String population = champLine2[1];
    }
    if (line3.contains(countryName)){
       String surface = champLine3[2];
    }
    countries.add( new Country(countryName,population,surface) );
    Là, tu vas avoir une erreur de compilation, parce que population et surface n'existent pas lorsqu'on fait countries.add( new Country(countryName,population,surface) ); ! Ceci devrait t'interpeler sur les valeurs de population et surface pour les pays tels que les conditions line2.contains(countryName) et/ou line3.contains(countryName) ne sont pas vraies (ce qui est plus difficile de voir avec ta déclaration externe des variables).

    Ainsi :
    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
    String countryName = champLine1[0]; // le pays est en première position
     
    String population;
    if (line2.contains(countryName)){
       population = champLine2[1];
    }
    else {
       population = null; // ou une autre valeur par défaut...
    }
    String surface;
    if (line3.contains(countryName)){
       surface = champLine3[2];
    }
    else {
       surface = null; // ou une autre valeur par défaut...
    }
    countries.add( new Country(countryName,population,surface) );
    Bon, après, je ne suis pas sûr que le contains soit le meilleur moyen de tester si une ligne contient le pays. Disons que ça peut marcher, ou pas, en fonction de tes données et de leur qualité... Comme tu disais que tes fichiers n'étaient pas triés de la même manière, je pense que tu devrais plutôt opter pour une lecture séparée, des maps, et une fusion à la fin.
    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.

  7. #47
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 52
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    while (champLine2[0] != null ){ champLine2[0] ne change jamais dans le while, donc cette boucle est infine. Donc tu ajoutes indéfiniment des pays dans la liste, donc tu exploses la mémoire.

    Mais à quoi sert ce while ? Si le but est de ne pas ajouter un pays si champLine2[0] est null, il suffit de faire un if.
    Le probleme c'est qu'en faisait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (champLine2[0] != null){..}
    ca me remet l'erreur d'avant soit : java.lang.ArrayIndexOutOfBoundsException: 0


    Bon, après, je ne suis pas sûr que le contains soit le meilleur moyen de tester si une ligne contient le pays. Disons que ça peut marcher, ou pas, en fonction de tes données et de leur qualité... Comme tu disais que tes fichiers n'étaient pas triés de la même manière, je pense que tu devrais plutôt opter pour une lecture séparée, des maps, et une fusion à la fin.
    Oui j'ai pensé à faire une HashMap qui permettrait de réunir les informations des fichiers, mais j'avais une erreur sur ma classe et je voulais pas m'attarder dessus, puisque je n'avais plus beaucoup de temps pour le rendu..

  8. #48
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Sara_hda Voir le message
    Le probleme c'est qu'en faisait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (champLine2[0] != null){..}
    ca me remet l'erreur d'avant soit : java.lang.ArrayIndexOutOfBoundsException: 0
    Il est impossible d'avoir cette exception avec le if si tu ne l'a pas avec le while. La seule différence qu'il y a entre le if à la place du while, c'est que ça exécute le bloc du while qu'une seule fois. Le problème de l'ArrayIndexOutOfBoundsException est ailleurs.


    Citation Envoyé par Sara_hda Voir le message
    Oui j'ai pensé à faire une HashMap qui permettrait de réunir les informations des fichiers, mais j'avais une erreur sur ma classe et je voulais pas m'attarder dessus, puisque je n'avais plus beaucoup de temps pour le rendu..
    Bah t'attarder à corriger une erreur dans un code simple à mettre au point et un autre beaucoup plus difficile à mettre au point n'est pas vraiment une perte de temps, au contraire.
    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.

  9. #49
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 52
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Il est impossible d'avoir cette exception avec le if si tu ne l'a pas avec le while. La seule différence qu'il y a entre le if à la place du while, c'est que ça exécute le bloc du while qu'une seule fois. Le problème de l'ArrayIndexOutOfBoundsException est ailleurs.
    Je sais bien, pourtant elle est bien là et en cliquant sur l'erreur c'est bien la ligne que je t'ai envoyé qui est surlignée..

  10. #50
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Le problème est que l'erreur d'outofmemory se passe alors que tu ne lis que la première ligne de chaque fichier. Alors que l'erreur d'ArrayIndexOutOfBound se passe sur une autre ligne. Mais le while ne corrige pas l'erreur qui se passe avec le if, elle fait simplement qu'il y a une autre erreur qui se passe avant.

    Je te donne un moyen de lire tes fichiers avec une seule méthode, séparément :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    	/**
             * 
             * @param file nom de fichier
             * @param lineToSkip nombre de ligne à ignorer au début du fichier
             * @param splitString expression régulière pour découpage de lignes en tableau
             * @param dataIndex numéro de la cellule dans le tableau 
             * @param name nom de la propriété à lire
             * @param countryIndex numéro de la cellule qui contient le nom du pays, ou -1 si on lit les noms de pays
             * @param map une map pour stocker le résultat
             * @throws IOException 
             */
    	public static void collect(String file, int lineToSkip, String splitString, int dataIndex, String name, int countryIndex, Map<String, Map<String,String>> map) throws IOException {
     
    		try(BufferedReader reader=Files.newBufferedReader(Paths.get(file))) {
    			for(String line = reader.readLine(); line!=null; line=reader.readLine()) {
    				if ( lineToSkip>0 ) { // on saute les lignes au début
    					lineToSkip--;
    					continue;
    				}
    				final String[] data = line.split(splitString);
    				String value = data[dataIndex];
    				if( countryIndex==-1 ) {
    					final Map<String,String> dataMap=new HashMap<>();
    					dataMap.put(name, value);
    					map.put(value, dataMap);
    				}
    				else {
    					final Map<String,String> dataMap=map.get(data[countryIndex]);
    					if ( dataMap!=null ) {
    						dataMap.put(name, value);
    					}
    				}
    			}
    		}
     
    	}
     
    	public static List<Counrtry> readCountries() throws IOException {
     
    		final Map<String, Map<String,String>> map = new HashMap<>();
     
    		collect("fichier1", 0, ",", 1, "name", -1, map); // nom du pays
    		collect("fichier2", 6/*on ignore les 6 première lignes*/, ",(?=([^\"]*\"[^\"]*\")*[^\"]*$)", 1/*population du pays dans colonne 2*/, "population", 0/* nom du pays dans colonne 1*/, map); // population
    		collect("fichier3", 0, "\t", 2/*surface du pays dans colonne 3*/, "surface", 1/* nom du pays dans colonne 2*/, map); // surface
     
    		return map.values().stream().map(m->new Country(m.get("name"),m.get("population"),m.get("surface"))).collect(Collectors.toList());
     
     
    	}
    Bien sûr, il faudra ajuste parce que je ne connais pas le format de tes fichiers (j'ai déduit ce que je pouvais de ton code).
    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.

  11. #51
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 52
    Points : 3
    Points
    3
    Par défaut
    On a donc une Arraylist d'HashMap ?

    J'ai fais les modifications nécessaires au programme, mais je me questionne sur un truc j'avais ceci de base
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArrayList<Country> countries = new ArrayList<Country>();
    "countries" était le nom de mon tableau en gros, mais dans ta méthode je ne vois pas par quoi je dois le "remplacer". Je m'explique plus bas dans ma classe j'ai des fonctions de recherche par critère et du coup je me sers de "countries" mais là il n'existe plus.. Je dois faire comment ?
    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
    public Country searchByCountryName(String countryName) throws NoSuchElementException { 
     
    		Country result = null;
    		for (Country country: countries) {
    			if (country.getCountryName().equals(countryName)) {
    				result = country;
    			}
    		}
    		if (result == null) {
    			throw new NoSuchElementException("Country " + countryName + " does not exists.");
    		} else {
    			return result; 
     
    		}
    	}

  12. #52
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Sara_hda Voir le message
    On a donc une Arraylist d'HashMap ?
    Nulle part il n'y a d'ArrayList de HashMap...

    Citation Envoyé par Sara_hda Voir le message
    J'ai fais les modifications nécessaires au programme, mais je me questionne sur un truc j'avais ceci de base [CODE]ArrayList<Country> countries = new ArrayList<Country>();
    Bah, countries = readCountries();, dans le constructeur de ta classe, tout simplement. Déclare ta variable countries comme ça : List<Country> countries;. Il vaut mieux en général typer ses variables avec l'interface de plus haut niveau, qu'avec la classe concrète : quand on manipule une liste, à part cas très particulier, on s'en fout que ça soit une ArrayList, une LinkedList ou autre, ce qui importe c'est que ça soit une List, voire même une Collection, voire même un Iterable dans la plupart des cas.
    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.

  13. #53
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 52
    Points : 3
    Points
    3
    Par défaut
    List<Country> countries;.
    Le programme n'accepte pas le dans le constructeur il demande de le supprimer, ce qui est bizarre non ?

  14. #54
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Tu as dû importer la classe java.awt.List, alors que c'est java.util.List que tu dois importer.
    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.

  15. #55
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 52
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Tu as dû importer la classe java.awt.List, alors que c'est java.util.List que tu dois importer.
    C'était bien ca, merci

    Le fait d'entrer les noms des fichiers dans les "collect" suffit ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	collect("rawdata_2147.txt", 0, "\t", 2/*surface du pays dans colonne 3*/, "surface", 1/* nom du pays dans colonne 2*/, map); // surface
    Car la méthode collect (qui permet de lire les fichiers) est avant celle de la List où est défini les fichiers

  16. #56
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    La méthode collect lit une seule propriété (on pourrait la faire évoluer pour pouvoir lire plusieurs propriétés) dans chaque ligne d'un fichier. Elle stocke dans une map par pays cette propriété (clef=nom de propriété, valeur=valeur de propriété). L'ensemble de ces maps est stockée dans une map dont la clef est le nom de pays, et la valeur est la map qui contient les propriétés de ce pays. On différencie l'exécution qui va créer les maps d'informations de pays par le paramètre countryIndex : s'il vaut -1, on lit le nom du pays, et on créé une nouvelle map pour le pays lu, et on la stocke dans la map globale qui stocke toutes les maps de chaque pays. S'il ne vaut pas -1, alors il s'agit de la position du nom de pays dans la ligne, et on utilise cette valeur pour retrouver la map d'informations du pays créée par l'appel où countryIndex vallait -1. Il est indispensable d'appeler en premier collect avec ce paramètre à -1 évidemment.

    La dernière ligne, return map.values().stream().map(m->new Country(m.get("name"),m.get("population"),m.get("surface"))).collect(Collectors.toList()); ne fait que transformer la map globale (remplie par les différents appels de collect()) en liste d'instances de Country. Il n'y a aucune notion de fichier dans cette ligne.
    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.

  17. #57
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 52
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    La méthode collect lit une seule propriété (on pourrait la faire évoluer pour pouvoir lire plusieurs propriétés) dans chaque ligne d'un fichier. Elle stocke dans une map par pays cette propriété (clef=nom de propriété, valeur=valeur de propriété). L'ensemble de ces maps est stockée dans une map dont la clef est le nom de pays, et la valeur est la map qui contient les propriétés de ce pays. On différencie l'exécution qui va créer les maps d'informations de pays par le paramètre countryIndex : s'il vaut -1, on lit le nom du pays, et on créé une nouvelle map pour le pays lu, et on la stocke dans la map globale qui stocke toutes les maps de chaque pays. S'il ne vaut pas -1, alors il s'agit de la position du nom de pays dans la ligne, et on utilise cette valeur pour retrouver la map d'informations du pays créée par l'appel où countryIndex vallait -1. Il est indispensable d'appeler en premier collect avec ce paramètre à -1 évidemment.

    La dernière ligne, return map.values().stream().map(m->new Country(m.get("name"),m.get("population"),m.get("surface"))).collect(Collectors.toList()); ne fait que transformer la map globale (remplie par les différents appels de collect()) en liste d'instances de Country. Il n'y a aucune notion de fichier dans cette ligne.
    Oui oui j'avais bien compris cela, ma question portait sur la méthode précédente, elle lit des fichiers dont elle n'a pas la source, puisque celle ci est déclarée dans la méthode d'après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    collect("rawdata_2147.txt", 0, "\t", 2/*surface du pays dans colonne 3*/, "surface", 1/* nom du pays dans colonne 2*/, map); // surface
    du coup ca me met tout un tas d'erreur :
    Exception in thread "main" java.nio.charset.MalformedInputException: Input length = 1
    at java.nio.charset.CoderResult.throwException(Unknown Source)
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
    at sun.nio.cs.StreamDecoder.read(Unknown Source)
    at java.io.InputStreamReader.read(Unknown Source)
    at java.io.BufferedReader.fill(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)

  18. #58
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Sara_hda Voir le message
    Oui oui j'avais bien compris cela, ma question portait sur la méthode précédente, elle lit des fichiers dont elle n'a pas la source, puisque celle ci est déclarée dans la méthode d'après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    collect("rawdata_2147.txt", 0, "\t", 2/*surface du pays dans colonne 3*/, "surface", 1/* nom du pays dans colonne 2*/, map); // surface
    Quelle méthode d'après ? D'après quoi ? Des fichiers dont elle n'a pas la source, qu'est ce que ça veut dire, c'est quoi la source d'un fichier ?

    Citation Envoyé par Sara_hda Voir le message
    du coup ca me met tout un tas d'erreur :
    Exception in thread "main" java.nio.charset.MalformedInputException: Input length = 1
    at java.nio.charset.CoderResult.throwException(Unknown Source)
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
    at sun.nio.cs.StreamDecoder.read(Unknown Source)
    at java.io.InputStreamReader.read(Unknown Source)
    at java.io.BufferedReader.fill(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    Il n'y a qu'une erreur, et c'est juste un problème de charset (tes fichiers ne sont pas UTF-8).
    Remplace juste try(BufferedReader reader=Files.newBufferedReader(Paths.get(file))) { par try(BufferedReader reader=Files.newBufferedReader(Paths.get(file),Charset.defaultCharset())) {
    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.

  19. #59
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 52
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Quelle méthode d'après ? D'après quoi ? Des fichiers dont elle n'a pas la source, qu'est ce que ça veut dire, c'est quoi la source d'un fichier ?
    Le nom du fichier en gros

    en ajoutant le Charset, une nouvelle erreur apparait :
    Exception in thread "main" java.nio.charset.MalformedInputException: Input length = 1
    at java.nio.charset.CoderResult.throwException(Unknown Source)
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
    at sun.nio.cs.StreamDecoder.read(Unknown Source)
    at java.io.InputStreamReader.read(Unknown Source)
    at java.io.BufferedReader.fill(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at world.WorldList.collect(WorldList.java:32)
    at world.WorldList.countries(WorldList.java:59)
    at world.WorldList.searchByCountryName(WorldList.java:72)
    at world.WorldTest.testOperations(WorldTest.java:35)
    at world.WorldTest.testWorldArrayList(WorldTest.java:23)
    at world.WorldTest.main(WorldTest.java:15)

  20. #60
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Bah, c'est exactement la même erreur.. tu l'as bien ajouté le charset comme je t'ai indiqué ? Tu n'avais pas cette erreur avec tes FileReader ? Parce que ça utilise exactement le même charset qu'avec FileReader (Charset.defaultCharset()) !
    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. [AC-2003] Requête pour remplir une table à partir d'un fichier Excel
    Par olivier777 dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 07/09/2009, 10h52
  2. remplir une combobox à partir d'un fichier .csv
    Par wolverine1987 dans le forum MFC
    Réponses: 24
    Dernier message: 28/04/2009, 11h00
  3. Tracer une courbe à partir d'un fichier .csv
    Par dzonaser dans le forum MATLAB
    Réponses: 2
    Dernier message: 25/10/2008, 14h48
  4. Réponses: 0
    Dernier message: 07/02/2008, 16h09
  5. Remplir une liste à partir d'un fichier texte
    Par leroidje dans le forum Langage
    Réponses: 1
    Dernier message: 01/07/2007, 08h41

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