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 dont les 2 valeurs sont récupérables ?


Sujet :

Collection et Stream Java

  1. #1
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut Map dont les 2 valeurs sont récupérables ?
    Bonsoir,

    j'ai besoin pour un programme d'une sorte de HashMap<Integer, String>, sauf qu'il faudrait que ca soit possible de pouvoir récupérer l'Integer (qui sera l'index) et le String qui sera la valeur, donc en fait au lieu d'avoir un couple clé - valeur, je voudrais un couple valeur - valeur. Le problème avec la HashMap, c'est qu'il est impossible de faire un get(String) qui va te retourner l'Integer de ce String.

    De plus il me faudrait quelque chose qui garde les éléments de la liste dans l'ordre dans lesquels je les ai entrés. Je demande beaucoup je sais

    Pour le moment, j'emploie ArrayList<Object[]> le premier élément du tableau est un Integer et le deuxième un Object[], mais c'est pas pratique du tout pour intervenir dessus, car je peut pas directement aller chercher quelque chose dedans puisqu'ils sont ordonnées dans l'ordre ou je les ai mis et je sais pas à quelle position est le couple que je veut chercher...

    Je sais pas si j'ai été très clair

    Merci d'avance

  2. #2
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    salut,

    A la premiere lecture, pour l'association valeur <-> valeur, j'ai pensé faire un double map, donc dans l'un tu mets clé -> valeur et dans l'autre tu mets valeur -> clé...
    a la deuxieme lecture, j'ai capté le "dans l'ordre ou je les ai mis", et ca je sais pas si c'est possible, il y a bien l'interface SortedMap mais c'est une Map triée et non ordonnée dans l'ordre dans lequel tu les entre..

    J'espere avoir pu t'aider.

    mavina

  3. #3
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Oui ca m'aide un peu, mais si je dois faire 2 Map autant vaut mon ancienne technique, car en plus j'avais l'ordre de respecté.

    Mais je me suis aussi rendu compte d'un truc... C'est bien beau que la liste soit triée dans l'ordre mais faut aussi que je puisse y accéder dans l'ordre, donc dans le style de faire une boucle while(collection.hasNext) et collection.next, mais là ca commence vraiment à se compliquer... Me faudrait presque une triple association clé - valeur - valeur maintenant.

    Bon, plus qu'à espèrer qu'un grand pro du java ou quelqu'un avec une bonne capacité de discernement arrive à trouver quelque chose qui me sorte de là ^^

  4. #4
    Membre chevronné Avatar de Scorpyosis
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2004
    Messages : 365
    Par défaut
    Pourquoi ne pas créer une classe qui contient ton integer et la string ? ainsi tu peux stocker dans une ArrayList... Ca peut etre plus simple a gerer que deux map ...

  5. #5
    Membre éprouvé Avatar de nin2
    Profil pro
    Inscrit en
    Février 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Février 2005
    Messages : 100
    Par défaut
    Pour garder l'ordre des insertions dans une Map, il est possible d'utiliser la classe d'implémentation LinkedHashMap. Ca peut donc être une solution, mais toujours avec deux Maps...

    Sinon, la solution de Scorpyosis me semble être une bonne idée.

  6. #6
    Membre expérimenté Avatar de @ldehan
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 215
    Par défaut
    La derniere solution que j'entervoie et qui n'est valable que si le nombre de couple est restreint ce serait de faire une double entrée a chaque fois..

    une fois dans le sens Integer->String et une fois dans le sens String->Integer.

    ca n'est interessant que si l'essentiel des acces se font par get et pas par iteration evidemment...

    dans le cas contraire, la solution de Scorpyosis reste la meilleure.

  7. #7
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    La solution de scorpyosis est bonne

    Elle va déja me permettre des traitements plus faciles

    mais le problème va rester que si je veut faire un get(Integer) sur ma classe, il me faudra obligatoirement parcourir toute l'arrayList puisque je ne sais pas dans quel ordre il sont rangés...

    Le mieux qui serait, serait une Map avec 3 valeurs : Valeur de position - ID - Valeur, sur la quelle je puisse faire get(Integer ID) qui me retournera la valeur et get(String valeur) qui me retournera l'ID. Mais je vois pas du tout comment faire ca...

  8. #8
    Membre chevronné Avatar de Scorpyosis
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2004
    Messages : 365
    Par défaut
    Une autre solution mais là ca devient affreux, c'est deux stocker dans ton arraylist ton integer puis ton string. Les cases paires pour les integer et impaires pour les string si je peux m'exprimer ainsi. Si tu veux faire un get(Integer) tu fais un indexOf, ainsi sachant si veux le string tu prends la case d'apres et de meme pour un get(String) ou la tu prends la case d'avant.

    Le mieux reste de créer une classe qui se charge de faire ses manipulation style MyArrayList avec des methode get(Integer) et get(String) qui te renvoie un objet contenant a la fois le integer et le string (cf ma proposition precedente) .

  9. #9
    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,


    Dans ces cas là penser à jeter un coup d'oeil à Jakarta Commons qui propose pas mal d'API qui peuvent s'avérer utile...

    Dans ce cas on peut trouver dans les Commons Collections une interface BidiMap (et quelques implémentations) qui représente une Map bidirectionnelle (avec une méthode getKey() pour récupérer la clef depuis la valeur).


    Par contre je ne comprend pas trop ta volonté de conserver l'ordre d'ajout des éléments... C'est un peu contre la logique des Map...

    Tu pourrais expliquer ton besoin ?

    a++

  10. #10
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    ok, je vais expliquer tout ca

    En fait je récupére une liste de noms depuis une base de données et je les classes par ordre alphabetique, donc je les mets ensuite dans une liste déroulante toujours dans l'ordre alphabetique.

    Pour le moment ca allait, je faisais rien sur ces ArrayList, seulement maintenant, j'ai un id et je dois aller chercher dans ces arrayList, à quoi correspond cet id, donc pour le moment, ca me donne un code de ce style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if(action == 1){
       for(int id : (ArrayList<Integer>)infos[2]){
        for(Object[] acteur : acteurs)
         if((Integer)acteur[0] == id){
          listActeursTemp.addItem(acteur[1]);
         }
        index++;
       }
      }
    Ce qui est pas très beau, mais fonctionnel.

    Voilà pourquoi, j'ai besoin de l'ordre dans lequel jes les sorts pour l'affichage, mais ensuite j'ai besoin de l'id et de la valeur pour mes traitements...

  11. #11
    Membre chevronné Avatar de Scorpyosis
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2004
    Messages : 365
    Par défaut
    Voila le code de ce que je te proposais :
    MyArrayList.java :
    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
     
    import java.util.ArrayList;
     
    public class MyArrayList {
     
        private ArrayList<Object> tableau ;
     
        public MyArrayList()    
        {
            this.tableau = new ArrayList<Object>();
        }
     
        public void put(String nom, Integer id)
        {
            this.tableau.add(id);
            this.tableau.add(nom);
        }
     
        public ObjetStockage get(String nom)
        {
            ObjetStockage obj = null ;
            if (this.tableau.indexOf(nom) > 0)
            {
                obj = new ObjetStockage((String)this.tableau.get(this.tableau.indexOf(nom)),(Integer)this.tableau.get(this.tableau.indexOf(nom)-1));            
            }
            return obj;
        }
     
        public ObjetStockage get(Integer id)
        {
            ObjetStockage obj = null ;
            if (this.tableau.indexOf(id) >= 0)
            {
                obj = new ObjetStockage((String)this.tableau.get(this.tableau.indexOf(id)+1),(Integer)this.tableau.get(this.tableau.indexOf(id)));            
            }
            return obj;
        }    
    }
    et ObjetStockage.java :
    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
     
    public class ObjetStockage 
    {
        private String nom ;
        private Integer id ;
     
        public ObjetStockage(String nom, Integer id)
        {
            this.nom = nom ;
            this.id = id ;
        }
     
        public String getNom()
        { return this.nom ; }
     
        public Integer getId()
        { return this.id ; }
     
    }
    Classe dont le nom est trés équivoque vous en conviendrez.

    Cette solution marche aprés elle n'est peut-être pas optimale....

  12. #12
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Voilà, j'ai fait une classe qui fait tout ce dont j'ai besoin basée sur celle de Scorpyosis.

    Merci beaucoup à ceux qui m'ont aidé

    Pour ceux que ca intéresse voilà la bête :

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    public class Stock {
     private ArrayList<Object> tableau;
     private int position = 1;
     
     public Stock(){
      tableau = new ArrayList<Object>();
     }
     
     public void put(int id, String value){
      tableau.add(id);
           tableau.add(value);
     }
     
     public String getValueOf(int id){
      int index = tableau.indexOf(id);
     
      if (index >= 0){
       return (String)tableau.get(index+1);          
      }
     
      return null;
     }
     
     public Integer getIdOf(String value){
      int index = tableau.indexOf(value);
     
      if(index > 0){
       return (Integer)tableau.get(index-1);
      }
     
      return null;
     }
     
     public int getItemCount(){
      return tableau.size() /2;
     }
     
     public boolean hasNext(){
      if(position < tableau.size()){
       return true;
      }
      return false;
     }
     
     public String next(){
      position += 2;
      return (String)tableau.get(position - 2);
     }
     
     public void first(){
      position = 1;
     }
    }

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 14/08/2014, 11h10
  2. Réponses: 13
    Dernier message: 07/06/2014, 09h36
  3. Réponses: 4
    Dernier message: 17/01/2010, 10h45
  4. Réponses: 2
    Dernier message: 04/10/2007, 13h42
  5. jointures dont les 2 membres sont des select
    Par rémi_tounul dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 26/04/2005, 14h56

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