1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    mars 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : mars 2017
    Messages : 2
    Points : 1
    Points
    1

    Par défaut Concaténation map de map

    Bonjour,
    J'ai 3 treeMap de type : <Long,<String, BigDecimal>>
    J'aimerai les concatèner dans une treeMap de même type , c'est à dire:
    - ajouter celle qui ne sont pas existant dans La map final ou
    -additionner les bigDecimal pour les clés existantes.
    Ex: map1(2016, <peinture, 100>), map2 = (2016,<peinture,200>) ce qui donne mapTotal = (2016, <peinture,300>).

    De préférence en utilisant le stream pour l'optimisation.

    Merci d'avance

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    10 399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : septembre 2009
    Messages : 10 399
    Points : 24 957
    Points
    24 957
    Billets dans le blog
    2

    Par défaut

    Salut,

    Plutôt que concaténation, je dirais fusion, pour penser immédiatement Map.merge, si tant est qu'il n'y a pas de null dans tes map (merge ne fonctionne pas dans ce cas).

    Déjà traiter le cas le plus bas, fusionner 2 Map<String, BigDecimal> :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private static Map<String, BigDecimal> mergeSubMap(Map<String, BigDecimal> m1, Map<String, BigDecimal> m2) {
    		Map<String,BigDecimal> m = new HashMap<>(m1);
    		m2.entrySet().forEach(e-> m.merge(e.getKey(), e.getValue(), BigDecimal::add ));
    		return m;
    	}
    ici, je pars du principe qu'on ne veut pas perdre l'une des map initiale, si tu t'en moques, tu peux simplifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private static Map<String, BigDecimal> mergeSubMap(Map<String, BigDecimal> m1, Map<String, BigDecimal> m2) { 
    		m2.entrySet().forEach(e-> m1.merge(e.getKey(), e.getValue(), BigDecimal::add ));
    		return m1;
    	}
    Puis traiter le cas de Map<Long, Map<String, BigDecimal>>.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private static void merge(Map<Long, Map<String, BigDecimal>> map1, Map<Long, Map<String, BigDecimal>> map2) {
    		map2.entrySet().forEach(e-> 
    		map1.merge(e.getKey(), e.getValue(), (m1,m2)-> mergeSubMap(m1,m2)));
    	}
    Puis pour fusionner tes trois map :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Map<Long, Map<String,BigDecimal>> map1 =
    Map<Long, Map<String,BigDecimal>> map2 =
    Map<Long, Map<String,BigDecimal>> map3 = 
     
    Map<Long, Map<String,BigDecimal>> map = new HashMap<>(map1); // une copie pour ne pas perdre les maps initiales
     
    merge(map, map2);
    merge(map, map3);
    Si tu veux conserver le caractère TreeMap, remplacer tous les new HashMap par new TreeMap.

    Une autre solution, pour la sous map :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    m2.entrySet().forEach(e->
    		m.compute(e.getKey(), (k, v)-> v==null?e.getValue():v.add(e.getValue())));
    qu'on peut adapté au cas e.getValue() null, le cas échéant.
    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.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    mars 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : mars 2017
    Messages : 2
    Points : 1
    Points
    1

    Par défaut

    Merci beaucoup joel pour la réponse.
    Je testerais demain sur mon poste.

    Même si je dois avouer que je n'ai pas bien compris le dernier morceau de code.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    10 399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : septembre 2009
    Messages : 10 399
    Points : 24 957
    Points
    24 957
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par Jeffrey974 Voir le message
    Même si je dois avouer que je n'ai pas bien compris le dernier morceau de code.
    C'est une alternative pour mergeSubMap. Le compute permet de faire une sorte de put/merge, un équivalent à :

    Code pseudojava : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if ( !map.containsKey(key) ) {
           map.put(key, value)
    } else {
     
           currentValue = map.get(key);
     
           map.put(key, combine(currentValue, newValue))
     
     
    }

    Le premier paramètre de compute est la clef, le second une BiFunction qui prend en paramètre la clef et la valeur, d'ou le (k,v)-> dans la lambda (le k c'est la clef qui est réinjectée, et v la valeur mappée sur cette clef).
    La fonction de combinaison (k, v)-> v==null?e.getValue():v.add(e.getValue())) s'explicite :
    1. si v est null (le mapping n'existe pas encore), alors c'est la valeur de la nouvelle entry (e.getValue())
    2. sinon, c'est l'ancienne valeur (v) additionnée à la valeur de la nouvelle entry
    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. [MAPS] SAS MAPS graphique 2 barres
    Par id301077 dans le forum ODS et reporting
    Réponses: 1
    Dernier message: 30/10/2008, 17h33
  2. Mapping de map un peu complexe
    Par hpavavar dans le forum Hibernate
    Réponses: 13
    Dernier message: 11/08/2008, 12h32
  3. [STL] Parcours de maps de maps de char*
    Par FenX. dans le forum SL & STL
    Réponses: 19
    Dernier message: 17/07/2007, 10h50
  4. Réponses: 8
    Dernier message: 09/02/2007, 16h31
  5. Réponses: 4
    Dernier message: 02/03/2006, 21h40

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