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 :

map et réferences.


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 151
    Par défaut map et réferences.
    Bonjour, voici un 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
     
    Map<String, Integer> map = new Hashtable<String, Integer>();
            map.put("un", 1);
            map.put("deux", 2);
            map.put("trois", 3);
            map.put("quatre", 4);
            map.put("cinq", 346);
            List<Map<String, Integer>> listeA = new ArrayList<Map<String,Integer>>();
            listeA.add(map);
            List<Map<String, Integer>> listeB = new ArrayList<Map<String,Integer>>();
            listeB.add(map);
     
            List<Map<String, Integer>> listeC = new ArrayList<Map<String,Integer>>();
            listeC.add(map);
            System.out.println("Contenu de map");
            Iterator<Integer> it = map.values().iterator();
            while(it.hasNext()){
                System.out.print(it.next() + " ");
            }
            System.out.println();
     
            System.out.println("Contenu de listeA");
            Map<String, Integer> mA = listeA.get(0);
            Iterator< Integer>itA =mA.values().iterator();    
            while(itA.hasNext()){
                System.out.print(itA.next() + " ");    
            }
            System.out.println();
            System.out.println("Contenu de listeB");
            Map<String, Integer> mB = listeB.get(0);
     
     
            Iterator< Integer>itB =mB.values().iterator();    
            while(itB.hasNext()){
                System.out.print(itB.next() + " ");    
            }
     
            System.out.println();
            System.out.println("Contenu de listeC");
            Map<String, Integer> mC = listeC.get(0);
            Iterator< Integer>itC =mC.values().iterator();    
            while(itC.hasNext()){
                System.out.print(itC.next() + " ");    
            }
    resultat : Contenu de map
    1 2 3 346 4
    Contenu de listeA
    1 2 3 346 4
    Contenu de listeB
    1 2 3 346 4
    Contenu de listeC
    1 2 3 346 4
    Quand je modifie le contenu de map , je modifie le contenu des listeA,B,C, ce qui est normal.
    La question : Comment changer le contenu de listeA et listeB sans changer map?
    D'une façon generale il y a t il un gadget pour obtenir une liste d'objets identiques mais avec des reférences differentes ? sans cloner mes objets?
    Mon algorithme sur 8000 polygones contenus dans des paires en depend .
    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 151
    Par défaut Map et références
    Je crois que j'ai trouvé . Il me faut créer pour chaque liste chaque map mais avec les mêmes contenus.
    Faut croire que je n'ai pas vraiment réfléchi.
    huuumm ça rique d'être lourd non ?
    svp ?

  3. #3
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    NON.

    C'est simple, n'est-ce pas

  4. #4
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Excuse, j'ai répondu en même temps que toi.

    ... mais il faut plus réfléchir à la solution que tu présentes

    Pour solutionner ton problème il faut :
    1. selon la quantité des objets que tu manipules, et la mémoire dont tu disposes, réfléchir à des versions ligths de ces objets... souvent on utilise le pattern muable / immuable (l'immuable étant normalement plus léger)... Si tu n'as pas besoin de les rendre persistants, un bon truc aussi est le hashcode, tout simplement.
    2. réfléchir aux frontières de valeurs entre les objets, les processus, etc, et cloner aux passages.
    3. ici, à priori, ce qu'il faudra cloner, c'est les map, et non pas les objets.

    Bon courage.

    PS : et pense à la balise CODE la prochaine fois sinon tu te feras gronder.

  5. #5
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Là tu veux juste une copie de ta liste, mais tu ne veux pas cloner en profondeur...

    Utilise donc le constructeur HashMap(Map).
    Tu passes ta liste source en paramètre du constructeur...

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 151
    Par défaut hashcode ?
    gifffftane==>Je te remercie des conseils. Et je penserai a la balise code explique moi un peu plus stp comment faire pour le hashcode

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 151
    Par défaut çà marche pas
    En fait mon idée n'est pas bonne.
    Er réalité pour les besoins ce ne sont pa s des map que j'ai mais des classes "doublets" que j'ai créées.
    voici le code du test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    for(int i = 0; i!=pts.length; ++i){//...
    EntitesSimules simulesExploitation = new EntitesSimules(); //ma copie
    	Iterator<Simule> iterateur = simules.creerIterateur(); // simules est l'agregat  dont je copie les elements
    	while(iterateur.hasNext()){
    	Simule s = iterateur.next();
    	simulesExploitation.ajouter(s); //je copie chaque element
    			}
    doublets[i] = new  DoubletExplSimules(arrayExpl[i],simulesExploitation); 
    //et plein d'autre choses 
    }
    Vous ne pensiez pas à cela peut être ?

    Donc quand je change une valeur de s dans simules et bien le même changement est effectué dans mes doublets .Visiblement le reference est concervée sur chaque objet s.

    Or si je veux cloner il me faudra modifier toutes les classes dependantes -trop long , trop long

  8. #8
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Bon... à force d'aller d'idées pas bonnes en solutions trouvées, je suis paumé... pourrais-tu nous expliquer de façon générale ce que tu veux faire, sans employer les mots map, liste, clone, bref sans rien d'informatique ??

  9. #9
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Oui c'est normal.

    En java, ce que tu ajoutes dans tes 3 listes, c'est une référence (un pointeur, si tu as déjà fait du C), vers ton objet Map.

    Donc, les 3 listes pointent vers le même objet. Si tu modifies celui-ci, tu le modifies pour les 3 listes.

    Si tu veux des objets différents, il ne faut pas enregistrer l'objet original, mais des copies de cet objet. Elles seront alors indépendantes.

    Et justement à cause de ce problème de références, la plupart des classes Java proposent une méthode "clone()" qui permet d'obtenir une copie identique de ton objet. Et lorsque tu modifies cette copie indépendante, ça n'impacte plus l'objet original.

    Cette dernière affirmation est toutefois à nuancer en fonction du type de clonage ("superficiel" ou "en profondeur"), mais là on rentre dans les détails. Si tu veux approfondir le sujet, fait une recherche sur ces termes. Dans ton cas, si un clonage superficiel te suffit, il te permettrait peut-être de répondre à ton besoin sans écrouler les performances de ton programme!

    [EDIT] Doublement grillé [/EDIT]
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

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

Discussions similaires

  1. Bump mapping
    Par Francky033 dans le forum DirectX
    Réponses: 7
    Dernier message: 22/11/2003, 18h35
  2. [EJB2.1 Entity] [BES] Mapping automatique et clés étrangères
    Par Bobby McGee dans le forum Java EE
    Réponses: 3
    Dernier message: 15/10/2003, 10h33
  3. Réponses: 2
    Dernier message: 11/07/2003, 18h24
  4. Problème avec memory mapping
    Par gemai dans le forum C
    Réponses: 13
    Dernier message: 04/07/2003, 09h50
  5. Editeur de MAP en delphi pour jeux directX
    Par PetitScorpion dans le forum DirectX
    Réponses: 5
    Dernier message: 09/07/2002, 18h47

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