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 :

Acces dans un MAp


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2
    Par défaut Acces dans un MAp
    Bonjour tout le monde,

    j'ai un petit soucis sur l'accès sur un MAP, je vais essayer de faire cours,

    voila comment je remplis le MAP :
    Tout en sachant que Position ici est une interface et ai une Enum;
    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
     
    final ArenaItem ai;
     
    mat.put(new Position() {
    					@Override
    					public int getX() {
    						return x;
    					}
     
    					@Override
    					public int getY() {
    						return y;
    					}
     
    					@Override
    					public boolean equals(Object arg0) {
    						if (!(arg0 instanceof Position)) {
    							return false;
    						}
    						Position p = (Position) arg0;
    						return this.getX() == p.getX()
    								&& this.getY() == p.getY();
     
    					}
     
    					@Override
    					public int hashCode() {
    						Integer x1 = x;
    						Integer y1 = y;
    						return Integer.rotateLeft(x1.hashCode(), 16)
    								^ y1.hashCode();
    					}
    				}, ai);

    Et j'y accede par la méthode suivante, je créé en faite un nouveau Position que j'envois à une méthode pour faire un get

    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
    for (int x = 0; x < model.getWidth(); x++) {
    			for (int y = 0; y < model.getHeight(); y++) {
    				final int i = x;
    				final int j = y;
    				setCellElements(new Position() {
    					@Override
    					public int getY() {
    						return j;
    					}
     
    					@Override
    					public int getX() {
    						return i;
    					}
     
    					@Override
    					public boolean equals(Object arg0) {
    						if (!(arg0 instanceof Position)) {
    							return false;
    						}
    						Position p = (Position) arg0;
    						return this.getX() == p.getX()
    								&& this.getY() == p.getY();
    					}
    				});
    			}
    		}
    Voici le get
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	private void setCellElements(Position pos) {
    		ArrayList<ArenaItem> elements = new ArrayList<ArenaItem>();
    		elements.add(arenaMap.get(pos));
    		model.setDeffered(pos.getX(), pos.getY(), elements);
    	}
    Mon problème est que le arenaMap.get(pos) me renvoi toujours null, alors si vous avez une idée je suis preneur.

    Merci pour votre temps

  2. #2
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Tu n'as pas redéfini le hashcode dans ta classe utilisée dans setCellPosition.

    Par ailleurs, je ne vois pas pourquoi tu tiens absolument à utiliser une classe anonyme, quand il tu redéfinis toujours la même chose ... Ton code serait beaucoup plus clair et propre avec une vraie implémentation de Position, et un constructeur idoine.

  3. #3
    Membre Expert 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
    Par défaut
    C'est que la méthode hashCode n'est pas redéfinie dans la deuxième sous-classe de Position. D'ailleurs tu ne devrais pas avoir à créer une classe anonyme Position juste pour passer x et y !
    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
    class Position {
     
       private int x, y;
     
       public Position(int x, int y) {
          this.x = x;
          this.y = y;
       }
     
    					@Override
    					public int getX() {
    						return x;
    					}
     
    					@Override
    					public int getY() {
    						return y;
    					}
     
    					@Override
    					public boolean equals(Object arg0) {
    						if (!(arg0 instanceof Position)) {
    							return false;
    						}
    						Position p = (Position) arg0;
    						return this.getX() == p.getX()
    								&& this.getY() == p.getY();
     
    					}
     
    					@Override
    					public int hashCode() {
    						Integer x1 = x;
    						Integer y1 = y;
    						return Integer.rotateLeft(x1.hashCode(), 16)
    								^ y1.hashCode();
    					}
    }

  4. #4
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2
    Par défaut
    Merci pour vos réponses, et j'ai finalement créé une classe concrète avec un constructeur et sa marche super
    Je me "prenait la tête" avec les classes anonymes car les interfaces sont imposées.
    Bref merci à vous deux


    J'ai une autre question,

    Peut-on étendre une énumération(Bon je sais que non) mais il y aurais t-il un moyen de passer outre :


    Par exemple : j'ai une Enum Item qui possède 5 attributs, et j'aimerais en étendant ou d'une autre manière pouvoir en rajouter
    Donc quand je ferais :
    Ici enum sera mes 5 attributs plus des énumérations que j'aurais rajouté peut-être dans une classe ?

    J'ai penser au wildcard et au superType "Enumeration" mais rien à faire !

    Avez-vous des idées ?

    Merci

  5. #5
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    C'est effectivement impossible.

    Au "mieux", tu peux :

    - Modifier l'enum si tu as la main dessus ;
    - Recréer une enum avec toutes les valeurs que tu souhaites ;
    - Créer une classe à la main qui te prenne les valeurs des différentes enum de ton choix, mais ça sera moche et surtout tu ne bénéficieras pas des avantages d'écriture liées aux enum.

    Le mieux à faire est probablement la deuxième solution : au final, tu as besoin d'une nouvelle enum.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 35
    Par défaut
    Il est peut-être possible de pallier à ce manque par le biais d'interfaces en faisant que ton enum implémente une interface donnée qui elle même pourrait en étendre une autre.
    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
    public interface Itoto extends Itata{
        public int getX();
    }
     interface Itata {
         public int getY();
    }
    enum Martin implements Itoto{
        UN(1,0),
        DEUX(2,0);
        private int x;
        private int y;
     
        Martin(int x, int y) {
            this.x = x;
           this.y = y;
        }
     
        public int getX() {
            return x;  
        }
     
        public int getY() {
            return y;  
        }
    }

Discussions similaires

  1. Réponses: 9
    Dernier message: 05/04/2005, 09h39
  2. Apache - Droits d'accès dans les répertoires
    Par rabobsky dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 22/03/2005, 22h54
  3. [Sécurité]Gestion des accès dans plusieurs bases
    Par vincentj dans le forum Débuter
    Réponses: 1
    Dernier message: 05/01/2005, 14h19
  4. Inserer des elements dans une map sans rangement ?
    Par Muetdhiver dans le forum C++
    Réponses: 3
    Dernier message: 07/09/2004, 11h09
  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