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 :

HashMap : Changer la valeur d'un objet référencé


Sujet :

Collection et Stream Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 125
    Par défaut HashMap : Changer la valeur d'un objet référencé
    Bonjour,

    je cherche à changer la valeur d'un String référencé dans une hashmap, au lieu de changer la référence de la clé de la map

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private String col1 = "defaut";
     
    private Map<Integer, String> cols = new HashMap<Integer, String>();
    cols.put(1, col1);
    Si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String s = cols.get(1);
    s= "change"
    mon col1 vaut toujours defaut;

    idem avec
    cols.get(1).replace...

    Comment puis-je changer la valeur de ma variable col1 à partir de la map?

    Une solution serait peut-être de créer un objet MonString, ainsi faire un cols.get(1) me retournerait bien une référence vers l'objet et non une valeur, mais je ne peux pas car ma variable doit être un String.

    Merci d'avance

  2. #2
    Membre chevronné Avatar de freddou17
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2013
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 341
    Par défaut
    Slt,
    Tu dois refaire un put sur la clé

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 125
    Par défaut
    Le problème reste le même, c'est la référence de la valeur associée à la clé qui change en effectuant un put, ma variable col2 ne change pas, elle n'est juste plus référencée par la map

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Map<Integer, String> cols = new HashMap<Integer, String>();
    col2="defaut";
    cols.put(2,col2)
    System.out.println(col2); //"defaut"
    l.cols.put(2, "change");
    System.out.println(cols.get(2)); //"change"
    System.out.println(col2);//"defaut"

  4. #4
    Invité
    Invité(e)
    Par défaut
    Tu ne peux pas, String est un objet immuable.
    Il faut que tu change la valeur de ton String dans ta map, puis que tu affectes de nouveau à ton attribut ton nouvel objet String.

    cols.get(1).replace...
    Te retourne une nouvelle instance de String

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 125
    Par défaut
    Ok merci, tant pis.

    j'ai en fait 20 variables
    String col1;
    String col2;
    ...
    String col20;

    L'idée était de pouvoir les modifier via une méthode de ce type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    setcol(int x, String val){
    this.colx = val;
    }
    J'ai donc tenté avec une map.
    Avez vous une autre idée autre que de passer par 20 setters avec un switch?

  6. #6
    Membre chevronné Avatar de freddou17
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2013
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 341
    Par défaut
    Du mal à comprendre la finalité.
    Et ce que tu as demandé dans ton premier message n'est pas ce que tu demandes dans ton deuxième ou j'ai mal compris...

    Si tu passes par un StringBuffer ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     StringBuffer buff = new StringBuffer("Test1");  
      Map map = new HashMap();  
      map.put(1, buff);  
      buff.append("Test2");  
      sysout(buff)// devrait être égale à map.get(1) ce qui revient à ton idée de créer un objet
      sysout(map.get(1))
    ++

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 125
    Par défaut
    Non ce n'est effectivement pas la même chose, la demande initiale est résolue par le fait que cela ne soit pas possible via une hashmap (car String objet immuable).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Class Ligne{
    private String col1;
    private String col2;
    ...
    private String col20;
     
    }
    Je cherche une manière générique de modifier une colonne, via un setter unique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    setcol(int x, String val){
    this.colx = val;
    }
    autrement ce sera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    setcol(int x, String val){
    if(x == 1) this.col1= val
    else if(x==2) this.col2=val
    ...
    }

    j'avais imaginé une map mais c'est apparemment non.

    Peut-être devrais-je changer de topic, mais j'en profitait ici !

  8. #8
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,



    La question c'est plutôt : pourquoi utiliser 20 attributs ????
    Si demain tu dois gérer 500 colonnes tu va te taper 500 attributs ???


    Un simple tableau fait amplement l'affaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Ligne{
    	private final String[] cols = new String[20];
     
    	public void setCol(int x, String val) {
    		this.cols[x] = val;
    	}
    }

    Ou à la rigueur une List pour plus de facilité surtout si la taille pourra varier...

    a++

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 125
    Par défaut
    C'est une bonne remarque mais je dois annoter chaque colonne pour être mappée en bdd via hibernate.

    Il n'y aura jamais plus de 20 colonnes c'est une spécification, au pire ça évoluera d'une ou 2 colonnes qui seront des colonnes techniques, ceci évite une table d'association pour une table ne possédant qu'une colonne VARCHAR (après est-ce mieux ou non... j'avoue que c'est moche de devoir écrire les 20 à la main) d'où l'idée d'au moins créer une methode générique qui simplifiera l'accès

  10. #10
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Ma foi tu peux utiliser l'introspection.

    Mais je confirme, c'est moche, et c'est bien là tout le problème. "Je dois annoter chaque colonne pour Hibernate" eh bien il aurait fallu faire les choses autrement pour Hibernate.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par oni13 Voir le message
    C'est une bonne remarque mais je dois annoter chaque colonne pour être mappée en bdd via hibernate.
    D'abord, si ton truc a un minimum de cohérence, ça ne devrait pas être col1,col2,col3, .... mais un truc du genre nom, prenom, ville, etc. Donne à test attributs des noms qui correspondent à leur rôle.


    Du coup, je ne vois pas le problème de faire un setCol(int x, String valeur), quelle serait l'utilité de cette méthode? Accède directement à l'attribute qui t'intéresse. Il me parrait évident que chacun qui appelle cette méthode le fera pour un rôle précis dépendant de l'attribut visé, donc peut d'utilité de cette méthode.

    Enfin, si tu veux vraiment aller dans ce sens là, qu'est-ce qui t'empeche d'écrire


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public String getAttribut1(){
       return getAttribut(1);
    }
     
    public void setAttribut1(String valeur){
       setAttribut(1,valeur);
    }

    mais encore une fois, ça reste préférable de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public String getMachin(){
       return machin;
    }
     
    public void setMachin(String machin){
        this.machin=machin;
    }
    Au moins on comprend ce que fait le code.

  12. #12
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 125
    Par défaut
    Cela correspond au stockage d'un fichier CSV sur 20 colonnes pour du parametrage, chaque colonne n'a donc jamais la même utilité, et une requête se fera comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    /**
    * numSortColonne le numéro de colonne à trier
    * sortDirection asc ou desc
    * columnsToReturn tableau des numéros de colonne à retourner
    * filters couple numero de colonne / valeur à filtrer
    **/
    getFile(int numSortColonne, String sortDirection, int[] columnsToReturn, List<String[]> filters)
    En gros !
    De la même manière le addFile() comportera entre autres un couple numColonne/valeur pour chaque ligne, d'où le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    setcol(int x, String val){
    this.colx = val;
    }
    Qui n'a pour simple but que de rendre plus lisible le code et rendre l'API plus évolutive

    Ce contenu sera affiché dans un tableau HTML paginé, et le clic sur une colonne (qui sera identifiée par sa position dans le tableau) entrainera une requête de filtrage sur cette colonne.
    D'ou le fait de partir sur 20 colonnes statiques automatiquement triées dans la table.
    Sinon je peux effectivement créer une liaison vers une table DATA qui comportera un VARCHAR et un NUMBER pour le numéro de la colonne.

    Voici une idée du contexte

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    En gros t'as une table, dont tu ne peux pas donner de nom au colonnes car tu ne sais pas à quoi elle correspondront et dans laquelles tu va pousser des données dont tu n'a pas la moindre idée du type ou de la classification, que tu affichera dans un tableau à l'écran. D'ailleurs je vois déjà les problèmes arriver. T'as fais de tes chamsp des varchars. Que se passera-t-il quand on va comparer des int? Des float? des dates? Tu peux continuer comme ça si ça t'amuse, on t'as déjà d'ailleurs donnée la solution. Mais franchement, c'est du n'importe nawak à mon avis, un BLOB avec ton CSV serait même plus propre. Dans deux ans qui saura encore à quoi correspond le champ col15 de l'import truc bidule que Mr Tartempion a fait? Quelle est la valauer ajoutée de la table?

    Au mieux ce serait plus propre d'avoir une table

    Data (int x, int y, Varchar valText, Number valNombre, Date valDate)

    mais même là, bof bof

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

Discussions similaires

  1. Réponses: 14
    Dernier message: 04/10/2012, 13h14
  2. Copier la valeur d'un objet et non sa référence.
    Par NejNej dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 08/01/2010, 09h59
  3. [POO] Changer la source d'un objet (flash) en Javascript
    Par thomine dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 11/02/2008, 16h54
  4. changer la valeur d'un objet Int32
    Par duaner dans le forum C#
    Réponses: 21
    Dernier message: 09/08/2007, 15h38
  5. Changer la valeur de la MTU sur un LAN
    Par nin2 dans le forum Réseau
    Réponses: 3
    Dernier message: 19/02/2005, 15h47

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