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

Documents Java Discussion :

Afficher l'heure associée à une activité depuis un csv.


Sujet :

Documents 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
    J'ai jamais parlé de "valeur 0" dans tes logs. Le 0 dont je parle c'est le nombre d'action d'un équipement donné pour une date et heure donnée lorsqu'il n'y a pas d'action de cet équipement pour cette date et heure donnée.

    Pour une ligne :

    date1, heure1, 1, 0, 1, 0, 0
    correspondant à une entête :
    Date, Heure, Equipement1, Equipement2, Equipement3, Equipement4, Equipement5
    On a, à la date date1 et l'heure heure1 :
    1. pour l'équipement Equipement1 : une action au moins
    2. pour l'équipement Equipement2 : aucune action
    3. pour l'équipement Equipement3 : une action au moins
    4. pour l'équipement Equipement4 : aucune action
    5. pour l'équipement Equipement5 : aucune action


    Si ton souci est de filtrer d'abord ton csv, puis de faire le comptage ensuite, malgré que ça donnerait le même résultat, tu peux appliquer la même technique de regroupement, mais au lieu de faire un counting() à la fin, il faut juste prendre l'un des élements au hasard dans la liste, le premier par exemple, ou le dernier, parce que c'est le plus simple à obtenir :

    Collectors.reducing(0, (a,b)->a ) pour le premier
    Collectors.reducing(0, (a,b)->b ) pour le dernier

    (enfin en non parallélisé en tout cas).

    Ensuite, tu peux réobtenir une liste des données en mettant à plat la map de map de map de int... On pourrait d'ailleurs également le faire directement sans passer par le reducing,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    List<Donnees> listDistinct = myEntries.stream()
    		        .skip(1)
    			.map(Donnees::new)
    			.collect(Collectors.groupingBy(Donnees::getDate,
    						Collectors.groupingBy(Donnees::getTime,
    						Collectors.groupingBy(Donnees::getEquipement)))) // on obtient une map de clef date, dont les valeurs sont des maps de clef time, donct les valeurs sont des map de clef equipement, donc les valeurs sont des listes de données
                .values().stream() // les maps de clef "Heure" (et valeur, un map de clef equipeemnt et valeur liste de donnees
                .flatMap(m-> m.values().stream()) // qu'on transforme en stream de Map de clef equipement
                .flatMap(m-> m.values().stream()) // qu'on transforme en stream de de liste de données
                .flatMap(listEquipement-> listEquipement.stream()) // qu'on transforme en stream de données
    		    .collect(Collectors.toList()); // et on transforme le stream résultant en liste (de données).
     ;
    listDistinct est la liste de toutes instances de données dictincte sur date, time et equipement (donc une pour chaque triplet de ces valeurs).
    Maintenant si tu appliques ce tu appliquais avant sur une liste de String[], en l'adaptant puisque tu as une list de données, et le la ligne de titre est déjà tratée, tu obtiendra bien un résutat équvalent à avant, sauf que comme il n'y a plus de doublons, il n'y a plus de risque d'avoir autre chose que 0 ou 1, dans la table croisée (le comptage d'un élément ne peut pas donnée autre chose que 1).
    Mais il vaut mieux procéder directement, ça évitera de reparcourir plusieurs fois les mêmes streams.
    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
    Nouveau membre du Club Avatar de gadje
    Homme Profil pro
    Développeur SI
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    Salut Joel,
    lorsque je modifie le counting() en le remplaçant par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collectors.reducing(0, (a,b)->b )
    j'ai une erreur de type:
    La méthode groupingBy(Function<? super T,? extends K>, Collector<? super T,A,D>) du type Collectors ne s’applique pas aux arguments (Donnees::getEquipement, Collector<Integer,capture#1-of ?,Integer>)
    Le remplacer par groupingByConcurrent
    J'ai tenté de modifier
    en
    mais ça ne change rien.

    Et losque j'utilise l'autre option que tu me propose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    List<Donnees> listDistinct = myEntries.stream()
    				        .skip(1)
    					.map(Donnees::new)
    					.collect(Collectors.groupingBy(Donnees::getDate,
    								Collectors.groupingBy(Donnees::getTime,
    								Collectors.groupingBy(Donnees::getEquipement)))) // on obtient une map de clef date, dont les valeurs sont des maps de clef time, donct les valeurs sont des map de clef equipement, donc les valeurs sont des listes de données
    		            .values().stream() // les maps de clef "Heure" (et valeur, un map de clef equipeemnt et valeur liste de donnees
    		            .flatMap(m-> m.values().stream()) // qu'on transforme en stream de Map de clef equipement
    		            .flatMap(m-> m.values().stream()) // qu'on transforme en stream de de liste de données
    		            .flatMap(listEquipement-> listEquipement.stream()) // qu'on transforme en stream de données
    				    .collect(Collectors.toList()); // et on transforme le stream résultant en liste (de 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
     
    out.print("date,");
    					Set<String> equipements = map.entrySet().stream()
    							.flatMap(edate-> edate.getValue().entrySet().stream()) // entries dans la sous map (des <LocalTime,Map<String, Long>) // C'EST ÇA LE NIVEAU EN PLUS
    				            .flatMap(etime -> etime.getValue().keySet().stream()) // entries dans la sous sous map
    								.collect(Collectors.toCollection(TreeSet::new));
    					out.println(equipements.stream().collect(Collectors.joining(",")));
     
    map.entrySet().stream().sorted(Map.Entry.comparingByKey())
    					 //.peek(edate  -> out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + ",")) // date,
    			                  .forEach(edate -> edate.getValue().entrySet().stream().sorted(Map.Entry.comparingByKey()) 
    			                          .peek(etime->  out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " " + etime.getKey().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + ",")) // time,
    			                                        .forEach(etime-> out.println(equipements.stream()
    													.map(eq -> etime.getValue().getOrDefault(eq, 0L))
    													.map(String::valueOf)
    							                        .collect(Collectors.joining(",")))));
    Par :
    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
     
    out.print("date,");
    					Set<String> equipements = listDistinct.entrySet().stream()
    							.flatMap(edate-> edate.getValue().entrySet().stream()) // entries dans la sous map (des <LocalTime,Map<String, Long>) // C'EST ÇA LE NIVEAU EN PLUS
    				            .flatMap(etime -> etime.getValue().keySet().stream()) // entries dans la sous sous map
    								.collect(Collectors.toCollection(TreeSet::new));
    					out.println(equipements.stream().collect(Collectors.joining(",")));
     
    listDistinct.entrySet().stream().sorted(Map.Entry.comparingByKey())
    					 //.peek(edate  -> out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + ",")) // date,
    			                  .forEach(edate -> edate.getValue().entrySet().stream().sorted(Map.Entry.comparingByKey()) 
    			                          .peek(etime->  out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " " + etime.getKey().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + ",")) // time,
    			                                        .forEach(etime-> out.println(equipements.stream()
    													.map(eq -> etime.getValue().getOrDefault(eq, 0L))
    													.map(String::valueOf)
    							                        .collect(Collectors.joining(",")))));

  3. #43
    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 gadje Voir le message
    On ne peut pas écrire ça en Java (utiliser des types primitifs pour paramétrer des classes). C'est Map<String, Integer>Mais attention, avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collectors.reducing(0, (a,b)->b )
    on obtient pas un int ou Integer, mais un Donnee.
    Je t'avais montrer ce code pour l'éventualité de générer une liste de données intermédiaire, dédoublonnée (une List<Donnees> donc).

    Dans un des posts précédent je t'avais donnée l'expression Collectors.reducing(0, (a,b)->1 ) pour remplacer le counting(), qui lui retournait directement un int (donc le Map<String, Long> devenait effectivement un Map<String, Integer> dans ce cas. On aurait pu aussi écrire Collectors.reducing(0, (a,b)->1L) pour retourne un long, et donc ne pas avoir à changer le Map<String, Long>


    Citation Envoyé par gadje Voir le message
    Et losque j'utilise l'autre option que tu me propose:
    il manque la fin de la phrase...
    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.

  4. #44
    Nouveau membre du Club Avatar de gadje
    Homme Profil pro
    Développeur SI
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    Losque j'utilise l'autre option que tu me propose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    List<Donnees> listDistinct = myEntries.stream()
    				        .skip(1)
    					.map(Donnees::new)
    					.collect(Collectors.groupingBy(Donnees::getDate,
    								Collectors.groupingBy(Donnees::getTime,
    								Collectors.groupingBy(Donnees::getEquipement)))) // on obtient une map de clef date, dont les valeurs sont des maps de clef time, donct les valeurs sont des map de clef equipement, donc les valeurs sont des listes de données
    		            .values().stream() // les maps de clef "Heure" (et valeur, un map de clef equipeemnt et valeur liste de donnees
    		            .flatMap(m-> m.values().stream()) // qu'on transforme en stream de Map de clef equipement
    		            .flatMap(m-> m.values().stream()) // qu'on transforme en stream de de liste de données
    		            .flatMap(listEquipement-> listEquipement.stream()) // qu'on transforme en stream de données
    				    .collect(Collectors.toList()); // et on transforme le stream résultant en liste (de données).
    Je remplace :
    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
     
    out.print("date,");
    					Set<String> equipements = map.entrySet().stream()
    							.flatMap(edate-> edate.getValue().entrySet().stream()) // entries dans la sous map (des <LocalTime,Map<String, Long>) // C'EST ÇA LE NIVEAU EN PLUS
    				            .flatMap(etime -> etime.getValue().keySet().stream()) // entries dans la sous sous map
    								.collect(Collectors.toCollection(TreeSet::new));
    					out.println(equipements.stream().collect(Collectors.joining(",")));
     
    map.entrySet().stream().sorted(Map.Entry.comparingByKey())
    					 //.peek(edate  -> out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + ",")) // date,
    			                  .forEach(edate -> edate.getValue().entrySet().stream().sorted(Map.Entry.comparingByKey()) 
    			                          .peek(etime->  out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " " + etime.getKey().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + ",")) // time,
    			                                        .forEach(etime-> out.println(equipements.stream()
    													.map(eq -> etime.getValue().getOrDefault(eq, 0L))
    													.map(String::valueOf)
    							                        .collect(Collectors.joining(",")))));
    Par :
    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
     
    out.print("date,");
    					Set<String> equipements = listDistinct.entrySet().stream()
    							.flatMap(edate-> edate.getValue().entrySet().stream()) // entries dans la sous map (des <LocalTime,Map<String, Long>) // C'EST ÇA LE NIVEAU EN PLUS
    				            .flatMap(etime -> etime.getValue().keySet().stream()) // entries dans la sous sous map
    								.collect(Collectors.toCollection(TreeSet::new));
    					out.println(equipements.stream().collect(Collectors.joining(",")));
     
    listDistinct.entrySet().stream().sorted(Map.Entry.comparingByKey())
    					 //.peek(edate  -> out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + ",")) // date,
    			                  .forEach(edate -> edate.getValue().entrySet().stream().sorted(Map.Entry.comparingByKey()) 
    			                          .peek(etime->  out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " " + etime.getKey().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + ",")) // time,
    			                                        .forEach(etime-> out.println(equipements.stream()
    													.map(eq -> etime.getValue().getOrDefault(eq, 0L))
    													.map(String::valueOf)
    							                        .collect(Collectors.joining(",")))));
    les entrySet me retournent une erreur :
    La méthode entrySet() est indéfinie pour le type List<Donnees>

  5. #45
    Nouveau membre du Club Avatar de gadje
    Homme Profil pro
    Développeur SI
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    Je ne comprends pas comment fonctionne ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collectors.reducing(0, (a,b)->1)
    A quoi correspondent a & b et comment les spécifier ?
    Ni pourquoi elle me génère une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    La méthode groupingBy(Function<? super T,? extends K>, Collector<? super T,A,D>) du type Collectors ne s’applique pas aux arguments (Donnees::getEquipement, Collector<Integer,capture#1-of ?,Integer>)
    au niveau du groupingBy.

  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
    Citation Envoyé par gadje Voir le message
    les entrySet me retournent une erreur :
    La première méthode prenait une liste de String[], la transformait en liste de données, puis la transformait en map, par regroupement.

    La seconde transformait la liste de String[], en liste de Donnees.
    Ensuite, il faut reprendre cette liste de Donnees et la transformer en map, par regroupement, pour obtenir le même résultat que dans le cas ci-dessus.
    En 2 étapes.

    En dehors des aspects syntaxiques du langage, c'est ce genre de mécanismes d'enchainement qu'il est primordiale de comprendre pour élaborer des programmes.
    C'est comme si par exemple tu as une méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public String faitUnTruc(File file);
    si on fait une méthode public List<String) faitUnMachin(File file), et une autre public String faitUnBidule(List<String> liste),
    tu comprends bien qu'on peut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String resultat = faitUnTruc( new File(...) );
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    List<String> resultatIntermediaire = faitUnMachin(new File(...) );
    String resultat = faitUnBidule( resultatIntermediaire );
    Or toi ce que tu a écris, c'est comme si tu avais écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    List<String> resultatIntermediaire = faitUnMachin(new File(...) );
    String resultat = faitUnTruc( resultatIntermediaire );
    Forcément ça ne peut pas fonctionner.

    Le premier exemple que je t'ai donné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Map<LocalDate, Map<String, Integer>> map = myEntries.stream() // on parcourt la liste de String[] par stream 
    				        .skip(1) // on passe la ligne de titres
    					.map(Donnees::new) // on transforme chaque ligne en instance de Donnees
    					.collect(Collectors.groupingBy(Donnees::getDate, // on groupe d'abord par date
                                                       Collectors.groupingBy( Donnees::getTime , // puis par heure
                                                       Collectors.groupingBy(Donnees::getEquipement)))) // puis par équipement, , on obtient une Map<LocalDate, Map<LocalTime, Map<String, List<Donnees>>>> /*...*/
    De la première ligne à la troisième, on transforme une List<String[]> en List<Donnee>, puis ensuite, le collect crée la map dont tu as besoin (map). En quelque sorte, en entrée de .collect, on à une liste de Donnees non dédoublonnées.

    Je te donne un nouveau code qui créé une liste de Donnees dédoublonnées. Que tu dois transformer exactement de la même manière qu'auparavant, puisque tu cherches à obtenir le même résulat qu'auparavent au final.

    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
     
    List<Donnees> listDistinct = myEntries.stream() // myEntries c'est une List<String[]> qu'on convertit en Stream<String[]>
    				        .skip(1)
    					.map(Donnees::new) // qu'on converti en Stream<Donnee>
    					.collect(Collectors.groupingBy(Donnees::getDate,
    								Collectors.groupingBy(Donnees::getTime,
    								Collectors.groupingBy(Donnees::getEquipement)))) // on obtient une map de clef date, dont les valeurs sont des maps de clef time, donct les valeurs sont des map de clef equipement, donc les valeurs sont des listes de données
    		            .values().stream() // les maps de clef "Heure" (et valeur, un map de clef equipeemnt et valeur liste de donnees
    		            .flatMap(m-> m.values().stream()) // qu'on transforme en stream de Map de clef equipement
    		            .flatMap(m-> m.values().stream()) // qu'on transforme en stream de de liste de données
    		            .flatMap(listEquipement-> listEquipement.stream()) // qu'on transforme en stream de données
    				    .collect(Collectors.toList()); // et on transforme le stream résultant en liste (de données) (List<Donnees>)
     
    Map<LocalDate, Map<String, Integer>> map = listDistinct .stream() // on parcourt la liste de Donnees par stream 
    				        .collect(Collectors.groupingBy(Donnees::getDate, // on groupe d'abord par date
                                                       Collectors.groupingBy( Donnees::getTime , // puis par heure
                                                       Collectors.groupingBy(Donnees::getEquipement)))) // puis par équipement, , on obtient une Map<LocalDate, Map<LocalTime, Map<String, List<Donnees>>>> /*...*/
    Le reste ne change pas, puisqu'il s'appliquait déjà à ce même résultat (la variable map).
    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
    Nouveau membre du Club Avatar de gadje
    Homme Profil pro
    Développeur SI
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    Je te remercie de ta patience.
    Je vais tâcher d'étudier (et surtout d'intégrer) tout ce que tu viens de me transmettre.
    Je pense avoir compris la notion de map à 3 niveaux, de type poupée gigogne en quelque sorte.
    Une map qui a pour clé "date" et pour valeur une map ayant pour clé "heure" et pour valeur une map ayant une clé de type String et une valeur de type Integer.
    J'entre aperçois également la nécessité d'un passage d'un type List à Map.
    Pour le reste, je ne saisi pas tout mais je m'y emploie, non sans mal.
    Encore merci à toi.

  8. #48
    Nouveau membre du Club Avatar de gadje
    Homme Profil pro
    Développeur SI
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    Salut,
    je me retrouve (encore) avec des pb de parenthèses, je regardé, tout semble pourtant correcte.
    Nom : Erreur parenthèses2.jpg
Affichages : 142
Taille : 276,5 Ko
    Par ailleurs, quand tu parles de données déboulonnées, tu entends que chaque élément d'une ligne, séparés par une virgule, devient une donnée indépendante ?
    Merci d'avance.

  9. #49
    Nouveau membre du Club Avatar de gadje
    Homme Profil pro
    Développeur SI
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    Je me demande également si :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<LocalDate, Map<String, Integer>> map = listDistinct.stream()
    ne devrait pas être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<LocalDate, Map<LocalTime, Map<String, List<Donnees>>>> map = listDistinct.stream()
    pour que les trois niveaux (date, heure, valeur), soient parcourus.

  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
    Citation Envoyé par gadje Voir le message
    Salut,
    je me retrouve (encore) avec des pb de parenthèses, je regardé, tout semble pourtant correcte.
    Ce n'est pas un problème de parenthèse, mais de point-virgule, qui manque à la fin de la ligne.

    Citation Envoyé par gadje Voir le message
    Par ailleurs, quand tu parles de données déboulonnées, tu entends que chaque élément d'une ligne, séparés par une virgule, devient une donnée indépendante ?
    Pas "déboulonnées", "dédoublonnées". Je parle de suppression de doublons, c'est-à-dire de partir d'une liste de Donnees qui contient des doublons au sens que tu leur donnes dans le contexte (ici, même date, même heure, même équipement), et d'obtenir une liste qui ne contient qu'un seul élément ayant un triplet une certaine date, une certaine heure, et un certain équipement donc. L'équivalent d'un "select distinct" SQL sur ces trois 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.

  11. #51
    Nouveau membre du Club Avatar de gadje
    Homme Profil pro
    Développeur SI
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    Autant pour moi, j'avais lu déboulonné.
    J'ai testé en ajoutant un point virgule et en modifiant la structure de la Map comme demandé par Eclipse en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<LocalDate, Map<LocalTime, Map<String, List<Donnees>>>>
    Mais j'ai de nouveau mon pb au niveau du getOrDefault :
    La méthode getOrDefault(Object, List<Donnees>) du type Map<String,List<Donnees>> ne s’applique pas aux arguments (String, int)

  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 gadje Voir le message
    Je me demande également si :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<LocalDate, Map<String, Integer>> map = listDistinct.stream()
    ne devrait pas être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<LocalDate, Map<LocalTime, Map<String, List<Donnees>>>> map = listDistinct.stream()
    pour que les trois niveaux (date, heure, valeur), soient parcourus.
    Si, si il manque le niveau LocalTime. J'ai dû copier/coller une trop ancienne version.

    En revanche, il faut voir/revoir le List<Donnees> ! Par ce que là tu obtiens une liste des éléments pour le triplet, qui ne contiendra donc qu'un seul élément (vu qu'on à dédoublonner). Le but étant d'obtenir 0 ou 1, ce n'est pas une List<Donnees> donc qu'il faut obtenir (remettre le collector counting donnerait bien 1, et la map devriendrait Map<LocalDate, Map<LocalTime, Map<String, Long>>>).

    En conséquence, tu n'aurais pas à modifier le getOrDefault :
    Citation Envoyé par gadje Voir le message
    Autant pour moi, j'avais lu déboulonné.
    J'ai testé en ajoutant un point virgule et en modifiant la structure de la Map comme demandé par Eclipse en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<LocalDate, Map<LocalTime, Map<String, List<Donnees>>>>
    Mais j'ai de nouveau mon pb au niveau du getOrDefault :
    Là c'est sûr, le second paramètre de getOrDefault, c'est la valeur par défaut quand il n'y a pas de mapping dans la map pour la clef demandée. Une instance ! Toi, par List<Donnee> tu indiques un type de données : en Java, il est impossible de passer un type en paramètre d'une méthode. Tu ne devrais même pas écrire ça.
    Tu pourrais par exemple retourner une List vide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .map(eq -> etime.getValue().getOrDefault(eq,  Collections.emptyList())
    Mais je pense que tu devrais conserver le counting(), et donc .map(eq -> etime.getValue().getOrDefault(eq, 0L) pour obtenir un csv, avec data, heure, equipement suivi de 0 ou de 1.
    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
    Nouveau membre du Club Avatar de gadje
    Homme Profil pro
    Développeur SI
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    Donc, voila mon code après modifications :
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
    package miseEnFormeDonneesCSV;
     
     
    	import java.io.File;
    	import java.io.FileNotFoundException;
    	import java.io.FileOutputStream;
    	import java.io.FileReader;
    	import java.io.IOException;
    	import java.io.PrintStream;
    	import java.time.LocalDate;
    	import java.time.LocalTime;
    	import java.time.format.DateTimeFormatter;
    	import java.util.*;
    	import java.util.stream.Collectors;
    	import com.opencsv.*;
     
    	public class EntreeTraitement {
     
    		public static String type;
    		public static int cpt;
     
    		public static void main(String[] args) throws FileNotFoundException, IOException{	
    			for (int i = 0; i < 12; i++){						
    			if (cpt == 0){type = "eclairages_ouvert";}			
    			if (cpt == 1){type = "eclairages_ferme";}			
    			if (cpt == 2){type = "volets_ouvert";}			
    			if (cpt == 3){type = "volets_ferme";}
    			if (cpt == 4){type = "portes_ouvert";}			
    			if (cpt == 5){type = "portes_ferme";}			
    			if (cpt == 6){type = "plan_ouvert";}
    			if (cpt == 7){type = "plan_ferme";}
    			if (cpt == 8){type = "compteurs_etat";}
    			if (cpt == 9){type = "capteurs_etat";}
    			if (cpt == 10){type = "fenetres_ouvert";}
    			if (cpt == 11){type = "fenetres_ferme";}
     
    			String inputFile = type;
    			String[] creaRep = inputFile.toString().split("_");
    			String repGroupe = creaRep[0];
    			String fichierIn = "D:/STAGE du 29-11-16 au 23-12-16/Java/home/pi/KNX/logs/csv/" + type + ".csv";
    			File fichierCSV = new File(fichierIn);
    			cpt++;			
    			String etat = creaRep[1];
    			String csv = "D:/STAGE du 29-11-16 au 23-12-16/Java/home/pi/KNX/logs/data/" + repGroupe + "/" + etat + ".csv";
    			File fichierOut = new File(csv);
    			PrintStream out = new PrintStream(new FileOutputStream (fichierOut)); 
    			List<String[]> myEntries;
    			try (CSVReader reader = new CSVReader(new FileReader(fichierCSV))) {
    				myEntries = reader.readAll(); //Le contenu du fichier lu est passé dans myEntries					
     
    				List<Donnees> listDistinct = myEntries.stream() // myEntries c'est une List<String[]> qu'on convertit en Stream<String[]>
    				        .skip(1)
    					.map(Donnees::new) // qu'on converti en Stream<Donnee>
    					.collect(Collectors.groupingBy(Donnees::getDate,
    								Collectors.groupingBy(Donnees::getTime,
    								Collectors.groupingBy(Donnees::getEquipement)))) // on obtient une map de clef date, dont les valeurs sont des maps de clef time, donct les valeurs                                                   sont des map de clef equipement, donc les valeurs sont des listes de données
    		            .values().stream() // les maps de clef "Heure" (et valeur, un map de clef equipeemnt et valeur liste de donnees
    		            .flatMap(m-> m.values().stream()) // qu'on transforme en stream de Map de clef equipement
    		            .flatMap(m-> m.values().stream()) // qu'on transforme en stream de de liste de données
    		            .flatMap(listEquipement-> listEquipement.stream()) // qu'on transforme en stream de données
    				    .collect(Collectors.toList()); // et on transforme le stream résultant en liste (de données) (List<Donnees>)
     
    					Map<LocalDate, Map<LocalTime, Map<String, Long>>> map = listDistinct.stream() // on parcourt la liste de Donnees par stream 
    				        .collect(Collectors.groupingBy(Donnees::getDate, // on groupe d'abord par date
                                    Collectors.groupingBy( Donnees::getTime , // puis par heure
                                    Collectors.groupingBy(Donnees::getEquipement,
                                    Collectors.counting()
                                    )))); // puis par équipement, , on obtient une Map<LocalDate, Map<LocalTime, Map<String, List<Donnees>>>>
     
    					out.print("date,");
    					Set<String> equipements = map.entrySet().stream()
    							.flatMap(edate-> edate.getValue().entrySet().stream()) // entries dans la sous map (des <LocalTime,Map<String, Long>) // C'EST ÇA LE NIVEAU EN PLUS
    				            .flatMap(etime -> etime.getValue().keySet().stream()) // entries dans la sous sous map
    								.collect(Collectors.toCollection(TreeSet::new));
    					out.println(equipements.stream().collect(Collectors.joining(",")));
     
    					//date et heure à chaque ligne du csv
    					map.entrySet().stream().sorted(Map.Entry.comparingByKey())
    					 //.peek(edate  -> out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + ",")) // date,
    			                  .forEach(edate -> edate.getValue().entrySet().stream().sorted(Map.Entry.comparingByKey()) 
    			                          .peek(etime->  out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " " + etime.getKey().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + ",")) // time,
    			                                        .forEach(etime-> out.println(equipements.stream()
    													.map(eq -> etime.getValue().getOrDefault(eq, 0L))
    													.map(String::valueOf)
    							                        .collect(Collectors.joining(",")))));
     
    			out.close();
    			}
    			catch (NumberFormatException e){
    			       System.out.println("not a number"); 					
    			} 	
    			}
    			}	
    		}
    Mais j'ai toujours des valeurs supérieures à 1 dans mon csv :
    date,Ouverture_Porte_Entree_Exterieur,Ouverture_Porte_Entree_Salon,Ouverture_Porte_Salon_Chambre
    2017-03-16 17:08:14,0,2,0
    2017-03-16 19:26:22,0,0,1
    2017-03-16 19:28:45,0,0,1
    2017-03-16 19:28:53,0,0,1
    2017-03-16 20:04:23,0,0,1
    2017-03-16 20:04:27,0,0,1
    2017-03-16 20:04:29,0,0,1
    2017-03-16 20:04:31,0,0,1
    2017-03-16 20:15:04,0,0,1
    2017-03-16 20:15:06,0,0,1
    2017-03-16 20:15:09,0,0,1
    2017-03-16 20:15:12,0,0,1
    2017-03-16 20:15:14,0,0,1
    2017-03-16 20:15:15,0,0,2
    2017-03-16 20:15:17,0,0,1
    2017-03-16 20:43:34,0,0,1
    2017-03-16 20:43:36,0,0,1
    2017-03-16 20:43:37,0,0,1
    2017-03-16 20:43:38,0,0,2
    2017-03-16 20:43:39,0,0,1
    2017-03-16 22:20:56,0,0,1
    2017-03-16 22:21:01,0,0,1
    2017-03-16 22:24:17,0,0,1
    2017-03-16 22:24:20,0,0,1
    2017-03-16 22:24:23,0,0,2
    2017-03-16 22:24:24,0,0,1
    2017-03-16 22:24:25,0,0,2
    2017-03-16 22:24:26,0,0,1
    2017-03-16 22:45:11,2,0,0
    2017-03-16 22:45:14,0,3,0
    2017-03-16 22:45:15,0,1,0
    2017-03-16 22:45:17,0,1,0
    2017-03-16 22:45:18,0,1,0
    2017-03-16 22:48:06,0,1,0
    2017-03-16 22:48:09,0,1,0
    2017-03-16 22:48:37,0,2,0
    2017-03-16 22:49:27,0,2,0
    2017-03-16 22:50:14,0,0,1
    2017-03-16 22:50:17,0,0,1
    2017-03-16 22:50:18,0,0,1
    2017-03-16 22:50:19,0,0,1
    2017-03-16 22:50:20,0,0,1
    2017-03-17 09:31:33,0,1,0
    2017-03-17 09:31:34,0,1,0
    2017-03-17 09:31:35,4,0,0
    2017-03-17 09:31:39,0,2,0
    2017-03-17 09:31:43,0,1,0
    2017-03-17 09:31:44,0,1,0
    2017-03-17 09:31:51,0,2,0
    2017-03-17 09:44:34,0,2,0
    2017-03-17 09:44:37,0,1,0
    2017-03-17 09:44:38,0,1,0

  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
    C'est que tu as plusieurs entrées pour un triplet (date, heure, équipement). Dans ce cas au lieu du Collectors.counting(), utilise ce que j'avais proposé au début : Collectors.reducing(0, (a,b)->1).
    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
    Nouveau membre du Club Avatar de gadje
    Homme Profil pro
    Développeur SI
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    Que sont a & b ?

  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
    Dans Collectors.reducing(0, (a,b)->1), le second paramètre est une expression lambda qui représente l'implémentation du second paramètre, de type BinaryOperator<Integer>, une interface fonctionnelle spécialisant l'interface fonctionnelle BiFunction<Integer, Donnees, Integer>, une fonction à deux arguments donc, ou le premier est de type Integer, et le second de type Donnees. J'ai appelé le premier a et le second b. Dans une lambda, les types ne sont pas obligatoires, tant que le compilateur arrive à les déterminer tout seul.

    Le collector étant appelé pour un Stream de List<Donnees>, le b ça représente donc chaque élément de la liste (l'opérateur sera appelé successibement pour chaque valeur de Donnees de la liste). Le a ça représente un Integer, qui est le résultat du dernier appel de l'opérateur, ou, la première fois, la valeur d'initialisation, qui est le premier paramètre de reducing, le 0(j'aurais pu mettre n'importe quoi, on s'en moque ici, parce que la liste contient forcément au moins une Donnees, donc l'opérateur binaire sera toujours appelé au moins une fois. Et cet opérateur retourne toujours 1. Donc quelque soit le nombre d'éléments de la liste, on a comme résultat toujours 1.
    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
    Nouveau membre du Club Avatar de gadje
    Homme Profil pro
    Développeur SI
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    J'ai toujours une erreur :
    La méthode groupingBy(Function<? super T,? extends K>, Collector<? super T,A,D>) du type Collectors ne s’applique pas aux arguments (Donnees::getEquipement, Collector<Integer,capture#13-of ?,Integer>)
    lorsque j'ajoute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collectors.reducing(0, (a,b)->1)
    il m'est demandé de remplacer :
    par

  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
    Utilise Collectors.reducing(0L, a->1L, (a,b)->1L) à la place.
    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
    Nouveau membre du Club Avatar de gadje
    Homme Profil pro
    Développeur SI
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    Ça fonctionne parfaitement.
    Merci beaucoup Joel.drigo.

  20. #60
    Nouveau membre du Club Avatar de gadje
    Homme Profil pro
    Développeur SI
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    Salut,
    Comment puis je faire pour remplacer les valeurs à 0 par null ? Le type de sortie est long et non string sachant que je souhaite conserver les valeurs à 1.
    Comment pourrai je faire en sorte que chaque équipement soit écrit dans son propre fichier csv.
    Merci d'avance.

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/04/2012, 15h15
  2. [Toutes versions] Afficher l'heure dans une barre de menus personnalisés
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 24/11/2010, 09h58
  3. Afficher l'heure dans une jsp
    Par Manitobaa dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 18/03/2009, 12h44
  4. Réponses: 5
    Dernier message: 25/04/2008, 19h15
  5. Réponses: 5
    Dernier message: 07/06/2006, 12h11

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