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 :

[Collections] map ordonnée + accès par indice


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 6
    Par défaut [Collections] map ordonnée + accès par indice
    bonjour,

    je cherche à mettre en place une structure de données qui aurait les fonctionnalités suivantes :

    - type clé/valeur pour un accès direct via get(key)
    - la structure doit être ordonnée (et l'ordre ne doit pas changer avec le temps) :
    clé1 -> valeur1
    clé2 -> valeur2
    clé3 -> vlaeur3
    - accès également par indice via get(i)

    je travaille dans un envirronnement restreint et j'ai accès à :
    - interfaces: Collection, List, Map, Set
    - classes: AbstractCollection, AbstractList, AbstractMap, AbstractSet, ArrayList, Dictionary, HashMap, HashSet, Hashtable, Vector

    bien sur aucune classe ne répond à tous ces besoins, il faut donc que j'implémente ma propre structure en étendant/implémentant quelque chose d'existant : à votre avis quelle est la meilleure façon de faire ?

    Pour l'instant j'utilise des Hashtable et j'ai implémenté des methodes next et previous en me basant sur la clé de l'élément courant mais c'est assez lourd.
    Pour la méthode next par exemple, à chaque fois je dois reparcourir ma hashtable jusqu'à positionner mon Enumeration (keys) sur l'élt courant et ensuite je fais un nextKey = nextElement() puis un maHashtable.get(nextKey) pour récupérer l'élt recherché ... ouf!

    Pour mon souci d'ordre, je n'ai pas encore cherché mais je me suis rendu compte que lorsque l'on fait des put sur une hashtable, les éléments sont rangés à la façon d'une pile lifo, c'est à dire que mon 1er élt sera en fait le dernier élé ajouté.
    Ensuite l'ordre ne bouge pas donc je pourrai me contenter d'inverser ma hashtable une fois remplie pour avoir les éléments dans le bon ordre mais je trouve ça un peu crade et en plus ça ne fonctionnera pas si j'ajoute des éléments après l'inversion ...

    je pensais créer une classe qui implémenterait AbstractMap et rajouter une méthode get(int) (en m'aidant de AbstractMap.entrySet().toArray()) ... reste ce pb d'ordre ....

    qu'en pensez vous ?
    d'avance merci!

    vincent

  2. #2
    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 Re: [Structure données] map ordonnée + accès par indice
    Citation Envoyé par jedimind
    je pensais créer une classe qui implémenterait AbstractMap et rajouter une méthode get(int) (en m'aidant de AbstractMap.entrySet().toArray()) ... reste ce pb d'ordre ....
    Salut,

    Regarde si tu peux utiliser LinkedHashMap qui te permet de créer des map en conservant l'ordre d'ajout des éléments...

    Ensuite su peux très bien utiliser entrySet().toArray() si ce n'est pas trop pénalisant en temps d'accès...

    a++

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 6
    Par défaut
    non, je n'ai pas accès à LinkedHashMap ...
    en fait je travaille sur décodeur et l'api est assez limitée

    en terme de conteneurs je n'ai accès qu'aux éléments du package util cités plus haut

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 99
    Par défaut
    Salut,

    Pour cela il faut que tu travaille avec deux hashtables

    La premiere contient tes données, la seconde est une table qui associe à un indice (ordre d'entré de tes éléments) la valeur de la clé correspondante dans la premiere table.

    Je sais pas si je suis tres clair ?

    Un petit exemple pour comprendre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    HashTable table1 = new HashTable();
    HashTable table2 = new HashTable();
     
    for (int i = 0 ; i < NombreElements ; i++){
     
      table1.put(cle,valeur);
      table2.put(new Integer(i),cle);
    }
     
    String valeur1 = table1.get( table2.get(new Integer(0)));
    Je pense que ca repond à ton probleme ?

    PS : Le code n'est suremement pas syntaxiquement bon , c'est le principe qui compte.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Avril 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 6
    Par défaut
    oui effectivement, c'est une solution
    merci

    n'hesitez pas qd même à continuer à vous creuser la tête

  6. #6
    Membre actif
    Inscrit en
    Avril 2005
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 63
    Par défaut
    pourquoi pas simplement deux List's? une pour les cles et l'autre pour les valeurs
    pour get(Key) on peut traduire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try {
        return listValeurs.get(listCles.indexOf(Key);
    } catch(ArrayOutOfBoundsException e) {
        return null;
    }

  7. #7
    Nouveau membre du Club
    Inscrit en
    Avril 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 6
    Par défaut
    effectivement, c'est aussi une solution ... qui m'a l'air plus optimisée d'ailleurs puisqu'on ne stocke pas 2 fois la clé et que les objets List doivent être plus "légers" que des Hashtable ...

    Perso, j'avais commencé sur l'idée de chicorico :

    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
     
    public class EnhancedHashtable {
     
    	private Hashtable original;
    	private Hashtable orderMapping;
     
    	public EnhancedHashtable() {
    		original = new Hashtable();
    		orderMapping = new Hashtable();
    	}
     
    	public void put(Object key, Object value) {
    		orderMapping.put(new Integer(original.size()), key);
    		original.put(key, value);
    	}
     
    	public Object get(Object key) {
    		return original.get(key);
    	}
     
    	public Object get(int i) {
    		Object key = orderMapping.get(new Integer(i));
    		Object value = null;
    		try {
    			value = original.get(key);
    		} catch(NullPointerException npex) {}
     
    		return value;
    	}
     
    	public void clear() {
    		orderMapping.clear();
    		original.clear();
    	}
     
    	public Object getFirstElement() {
    		return this.get(0);
    	}
     
    	public Object getLastElement() {
    		return this.get(original.size()-1);
    	}
    }
    c'est simple et ça fonctionne

  8. #8
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 99
    Par défaut


    Merci d'avoir choisi ma piste

    Citation Envoyé par jedimind
    effectivement, c'est aussi une solution ... qui m'a l'air plus optimisée d'ailleurs puisqu'on ne stocke pas 2 fois la clé et que les objets List doivent être plus "légers" que des Hashtable ...
    Quelques petites precisions,

    La clé n'est pas stocké deux fois en mémoire (il n'y a pas ne new() ou de clone() ).
    Il ne faut pas oublier quand java le passage des paramètres d'une fonction se fait par référence et non par valeur (notion de pointeur et d'adresse mémoire). Par consequent la valeur de l'objet clé n'est pas dupliqué .

    L'acces est dans le pire des cas (c'est à dire recuperer le dernier element) linéaire avec une list, il est constant avec une HashTable...
    Si t'as beaucoup de données, utilise une HashTable sinon la list.

    Tu as probablement raison sur le fait qu'une HashTable prend plus de place en mémoire qu'une list, à cause du "new Integer(i)".

    J'espere t'avoir apporter quelques precisions. Sinon , ta classe est tres bien

    A+.

  9. #9
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 38
    Par défaut LinkedHashMap
    Bonjour,

    Même ce sujet est bien résolu, mais je voudrai ajouter une solution propre et rapide :

    Vous pouvez utiliser LinkedHashMap .
    par exemple :

    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
    Map<String, Integer> myMap = new LinkedHashMap<String, Integer>();
     
    //insertion
     
    while (....)
    {
          myMap .put("blabla"+i, 1); 
    }
     
    //affichage
     
    for(Entry<String, Integer> entry : myMap.entrySet())
    {     
         System.out.println("key: " + entry.getKey() + " -> value : " + entry.getValue());
    }
    Merci.

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

Discussions similaires

  1. [WD12] accès aux colonnes d'une table par indices
    Par le pingouin fou dans le forum WinDev
    Réponses: 4
    Dernier message: 05/04/2011, 13h59
  2. [JSP][HASHMAP][JSTL]Ou l acces par clé..
    Par 205 dans le forum Struts 1
    Réponses: 1
    Dernier message: 13/09/2006, 10h42
  3. Réponses: 3
    Dernier message: 08/06/2006, 17h38
  4. Déménagement de site et accès par IP
    Par VarioFlux dans le forum Serveurs (Apache, IIS,...)
    Réponses: 3
    Dernier message: 28/12/2005, 11h53
  5. Delphi7-DOA accéder au champ d'un enregistrement par indice
    Par delphim dans le forum Bases de données
    Réponses: 1
    Dernier message: 04/05/2005, 14h42

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