IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Modification d'un objet dans une map


Sujet :

Collection et Stream Java

  1. #1
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Points : 3 579
    Points
    3 579
    Par défaut Modification d'un objet dans une map
    Bonjour à tous,
    Je cherche à modifier la valeur d'un objet dans un HashMap, et je n'ai malheureusement pas réussi à trouver mieux que ce code pour l'instant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    HashMap<Character,Integer> dico = new HashMap<Character,Integer>();
    (...)
    Integer nbOcc = dico.get(caractereLu);
    nbOcc++;
    dico.remove(caractereLu);
    dico.put(caractereLu,nbOcc);
    En effet, JAVA ne permet pas de faire dico.get(caractereLu)++;
    Y a-t-il une autre solution que de lire la valeur, la modifier, puis supprimer avant de réinserer ? C'est quand même plutôt moche...
    "Historiquement, techniquement, économiquement et moralement, Internet ne peut pas être contrôlé. Autant s’y faire." Laurent Chemla

    Je soutiens Diaspora*, le réseau social libre.

    Veillez à porter une attention toute particulière à l'orthographe...

    Blog collaboratif avec des amis : http://geexxx.fr

    Mon avatar a été fait par chiqitos, merci à lui !

  2. #2
    Membre actif Avatar de Roy Miro
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 273
    Points : 290
    Points
    290
    Par défaut
    Bonjour,

    En java 5 et supérieur, lorsque tu as un Integer i, pour l'incrémenter tu fais juste i++;
    Tu n'as pas à l'incrémenter et le reboxer. Java 5 te l'incrémente puis te l'autoboxe "behind the scene" simplement.

    Ce code est suffisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Integer nbOcc = dico.get(caractereLu);
    nbOcc++;

  3. #3
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Points : 3 579
    Points
    3 579
    Par défaut
    j'avais essayé mais ça ne marchait pas, je vais retester.
    "Historiquement, techniquement, économiquement et moralement, Internet ne peut pas être contrôlé. Autant s’y faire." Laurent Chemla

    Je soutiens Diaspora*, le réseau social libre.

    Veillez à porter une attention toute particulière à l'orthographe...

    Blog collaboratif avec des amis : http://geexxx.fr

    Mon avatar a été fait par chiqitos, merci à lui !

  4. #4
    Membre actif Avatar de Roy Miro
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 273
    Points : 290
    Points
    290
    Par défaut
    Effectivement dans ton exemple avec la HashMap, j'ai le même souci

    Je viens de retester:
    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
    import java.util.HashMap;
     
    public class Test {
    public static void main(String[]args){
     
    	HashMap<String,Integer> dico = new HashMap<String,Integer>();
    	dico.put("one", new Integer(0));
    	Integer i = dico.get("one");
    	i++;
    	System.out.println(dico.get("one"));//affiche 0
     
    	Integer i2 = new Integer(10);
    	i2++;
    	System.out.println(i2);//affiche 11
     
    }
    }
    J'y réfléchis

  5. #5
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    C'est normal, Integer est un type immutable, une fois l'objet construit, il n'est plus modifiable.
    Tu peux faire ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    static class Compteur {
    	int n;
    }
     
    HashMap<Character,Compteur> dico = new HashMap<Character,Compteur>();
    Compteur nbOcc = dico.get(caractereLu);
    if (nbOcc == null) {
    	nbOcc = new Compteur();
    	dico.put(caractereLu, nbOcc);
    }
    nbOcc.n++;

  6. #6
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Points : 3 579
    Points
    3 579
    Par défaut
    Oo Je ne savais même pas que cela existait... Est ce pareil pour Character ? Quel est l'intérêt et d'où cela vient-il ?
    "Historiquement, techniquement, économiquement et moralement, Internet ne peut pas être contrôlé. Autant s’y faire." Laurent Chemla

    Je soutiens Diaspora*, le réseau social libre.

    Veillez à porter une attention toute particulière à l'orthographe...

    Blog collaboratif avec des amis : http://geexxx.fr

    Mon avatar a été fait par chiqitos, merci à lui !

  7. #7
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    C'est pareil pour tous les types "wrapper" qui encapsulent une valeur d'un type primitif, et pour le type String.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    tous les objets représentant des type de base sont immutable. Les raisons sont:
    • les performance;
    • le fait qu'ils servent souvent de clé
    • l'économie de mémoire

  9. #9
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Points : 3 579
    Points
    3 579
    Par défaut
    merci à tous pour ces précisions.
    Une petite dernière : que se passe-t-il lorsqu'on déclare une classe statique ?
    "Historiquement, techniquement, économiquement et moralement, Internet ne peut pas être contrôlé. Autant s’y faire." Laurent Chemla

    Je soutiens Diaspora*, le réseau social libre.

    Veillez à porter une attention toute particulière à l'orthographe...

    Blog collaboratif avec des amis : http://geexxx.fr

    Mon avatar a été fait par chiqitos, merci à lui !

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ca ne sert que pour les classes déclarées dans d'autres classes, ca permet qu'elle soit indépendante de l'existance d'une instance de la classe conteneur.

  11. #11
    Membre actif Avatar de Roy Miro
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 273
    Points : 290
    Points
    290
    Par défaut
    En effet Integer est immutable.

    Donc si j'ai une reférence Integer appelée 'i' et que je fais i++, cela va me créer un nouvel Integer puis l'affecter à la référence 'i'. Ceci donne l'illusion d'incrémenter un Integer.

    Mais pourquoi en tant que value de HashMap ça ne marche pas?

    Merci.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    comme on l'a dit, parce que c'est immuable.

  13. #13
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Citation Envoyé par Roy Miro Voir le message
    Mais pourquoi en tant que value de HashMap ça ne marche pas?
    i++ ça veut dire i = i + 1

    Si on pouvait faire ça avec des HashMap, qu'est-ce qui voudrait dire quoi ?

    Tu pensais que le langage Java avait choisi une classe particulière, HashMap (ou l'interface Map) pour faire que qu'un opérateur ++ soit utilisable d'une manière ou d'une autre avec, et ait un sens prédéfini ?
    Remarque, c'est pas spécialement bête. Mais non. Les Map sont des interfaces et classes très simples, sans aucune syntaxe dédiée.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  14. #14
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Citation Envoyé par Roy Miro Voir le message
    En effet Integer est immutable.

    Donc si j'ai une reférence Integer appelée 'i' et que je fais i++, cela va me créer un nouvel Integer puis l'affecter à la référence 'i'. Ceci donne l'illusion d'incrémenter un Integer.

    Mais pourquoi en tant que value de HashMap ça ne marche pas?

    Merci.
    Comme tu l'expliques, i++ crée un nouvel integer, et l'affecte à la référence 'i'. Et donc, 'i' ne pointe plus vers l'entier stocké dans la Map, mais vers ce nouvel entier. Si tu veux affecter ce nouvel entier à la Map, il faut le demander explicitement (avec un put).

  15. #15
    Membre actif Avatar de Roy Miro
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 273
    Points : 290
    Points
    290
    Par défaut
    i++ ça veut dire i = i + 1

    Si on pouvait faire ça avec des HashMap, qu'est-ce qui voudrait dire quoi ?

    Tu pensais que le langage Java avait choisi une classe particulière, HashMap (ou l'interface Map) pour faire que qu'un opérateur ++ soit utilisable d'une manière ou d'une autre avec, et ait un sens prédéfini ?
    Remarque, c'est pas spécialement bête. Mais non. Les Map sont des interfaces et classes très simples, sans aucune syntaxe dédiée.
    Citation Envoyé par Rei Ichido Voir le message
    Comme tu l'expliques, i++ crée un nouvel integer, et l'affecte à la référence 'i'. Et donc, 'i' ne pointe plus vers l'entier stocké dans la Map, mais vers ce nouvel entier. Si tu veux affecter ce nouvel entier à la Map, il faut le demander explicitement (avec un put).
    Ok, merci pour ces réponses!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Gestion d'identifiants d'objets contenus dans une Map qui transite entre 2 bundles
    Par Laurent.B dans le forum Plateformes réactives et architectures modulaires
    Réponses: 7
    Dernier message: 21/05/2012, 10h50
  2. [VB.NET] Suppression d'objets dans une collection
    Par master56 dans le forum VB.NET
    Réponses: 7
    Dernier message: 03/06/2010, 21h46
  3. Réponses: 0
    Dernier message: 27/03/2008, 00h18
  4. [Delta3d] probléme avec un objet dans une map
    Par astragoth dans le forum Développement 2D, 3D et Jeux
    Réponses: 1
    Dernier message: 27/03/2006, 14h49
  5. problème de références _ptr dans une map STL
    Par Mr_Tyu dans le forum CORBA
    Réponses: 1
    Dernier message: 10/08/2004, 10h39

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