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

Langage Java Discussion :

referencer un objet avec plusieurs clés


Sujet :

Langage Java

  1. #1
    Membre actif
    Inscrit en
    Juillet 2007
    Messages
    456
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 456
    Points : 231
    Points
    231
    Par défaut referencer un objet avec plusieurs clés
    Salut tout le monde,
    Pour des raisons de performance je voudrais à tout pris utilisé des HashMap, Hashtable etc.
    Je voudrais pouvoir identifier un objet grâce à 4 clés. L'objet JAVA MultiKeyMap répond en partie à cette problématique en offrant au maximum 5 clés pour identifier un Objet.

    Sauf que cette solution ne marchera pas dans mon cas, pq !
    AU fait, je peux avoir au maximum 4 clés, mais je peux me contenter de deux ou même trois clés pour identifier mon objet. Or avec MultiKeyMap, c'est pas possible.

    Je m'explique avec un exemple
    supposons que j'ai les 4 clés suivantes :
    "1", "B1", "C1", "T1" qui reference l'objet : "Object1"

    j'aurais quelque chose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MultiKeyMap map = new MultiKeyMap();
    map.put("1", "B1", "C1", "T1", "Object1");
    Avec MultiKeyMap pour retrouver l'objet "Object1", il faut absolument passer les 4 clés au get, cad
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    map.get("1", "B1", "C1", "T1");
    Moi je voudrais pouvoir retrouver Object1, avec seulement deux clés, trois et biensur 4 clés.
    Il faut que je précise, que dans mon cas la premiere clé ("1") est unique, donc il y aura pas de collision dans la HashMap a priori.

    Est ce que vous avez une idée, un modéle, un objet, qui pourra répondre à mon besion, on utilisant des HashTable ou un objet similaire, pour pouvoir une accès unitaire.

    Merci bien

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Je suis pas sur d'avoir compris le requirement. Mais, à priori, une HashMap basique devrait suffire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    map.put("1",object1);
    map.put("B1",object1);
    map.put("C1",object1);
    map.put("T1",object1);
    map.get("1") == map.get("B1") == map.get("C1") == map.get("T1")
    Maintenant, si tes gets on la forme "1" , ["1","B1"], ["1","C1"], fait simplement le get sur 1, non?

  3. #3
    Membre averti
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Points : 368
    Points
    368
    Par défaut
    Salut Esilien,

    l'utilité m'échappe un peu. Si la première clé est unique alors cette clé devrait suffire pour récupérer l'information. Sauf si tu n'as pas toujours accès à celle-ci.

    Dans ce cas, tu peux créer une MultiKeyMap qui va contenir l'ensemble des couples de clés (je ne mets pas le triplet car l'information ne devrait pas être nécessaire car tu dis pouvoir récupérer de manière unique l'objet avec deux clés). Voilà donc les couples et l'objet associé (la clé unique) :
    ("B1", "C1") -> "1"
    ("B1", "T1") -> "1"
    ("C1", "T1") -> "1"

    Et tu peux créer une HashMap (attention surtout pas une HashTable, elle est synchronisée) qui va simplement contenir ta clé unique et ton objet. Dans ton exemple <"1", "Object1">.

    A plus.

  4. #4
    Membre actif
    Inscrit en
    Juillet 2007
    Messages
    456
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 456
    Points : 231
    Points
    231
    Par défaut
    Merci pour vos réponses,
    C'est vrai que j'étais pas assez claire dans mon explication.
    La première clé est bien unique, sauf que généralement je la connais pas. La plus part du temps je connais la 2éme et 3éme clés.

    Effectivement darkxan, une solution serait d'inserer tous les couples possibles pour chaque ligne, en gros j'aurais 5 entrées pour chaque ligne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    map.put("1", "B1", "C1", "T1", "Object1")
    map.put("1", "B1", "C1", "Object1")
    map.put("1", "B1", "Object1")
    map.put("1", "C1", "T1", "Object1")
    map.put("1", "C1", "Object1")
    "T1" n'est jamais toutes seules avec la première clé

    Mais si j'ai 10000 lignes, alors la cette structure va être énorme, sachant que je peux avoir même 60000 lignes. fois 5, je vous laisse imaginer

    Je vous explique l'origine du probléme peut être que vous allez mieux me comprendre.
    j'ai une table qui à comme clé primaire la premiére clé ("1"). Les autres clés sont des paramètres possibles aux éventuelles requêtes SQL.

    Cette table je voudrais la charger dans une MultiKeyMap par exemple pour pouvoir avoir une accès unitaire aux différents enregistrements de cette table. Dans ce cas le get me remplacera la requête SQL.

    Il y a aussi d'autres soucis techniques, que c'est pas la peine de détailler, qui m'oblige à avoir une MultiKeyMap ou plusieurs HashTable( c mieux car j'ai des accès concurrents à cette structures).
    C'est principalement pour des raisons de pref, que je dois utiliser les Map, le traitement ne dois absolument pas dépasser qlq ms. Le remplacement des requetes SQL par un get n'est qu'une partie de ce long traitement. Il faut que je dispose toujours d'une structure JAVA qui contient toutes les données.

    Je sais pas si c'est plus clair mnt.
    Merci en tous cas

  5. #5
    Membre émérite
    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
    Points : 2 582
    Points
    2 582
    Par défaut
    Il n'y a pas de miracle et si tu veux qu'il y ait plusieurs clefs pour une même valeur, la solution à base HashMap simple est la plus... simple. Je ne connais pas le MultiKeyMap, alors je ne peux pas commenter la dessus.

    Attention que la multiplication des clefs ne multiplie pas la valeur ; il n'y a pas de doublons ; dans une HashMap tu as tes clefs et les valeurs et si une valeur est associée à plusieurs clef il n'y aura toujours qu'une seule valeur.

    Donc c'est une solution qui me semble économique en terme de mémoire et je ne vois pas comment on peut faire mieux. Tu as une appli qui réclame beaucoup de mémoire, c'est tout. Sinon il faut que tu passes par une appli base de données.
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 155
    Points : 199
    Points
    199
    Par défaut
    En sql, tu définit des index ( la primarykey est un index par défault).
    Ici, tu peux définir des index: ce sont tes MultiKeyMap (ou HashMap si index sur 1 seule colonne).

    Dans ton programme, tu peux te créer une classe qui stocke tes index.
    A chaque fois que tu veux te servir d'un index, tu dit lequel tu veux te servir, et tu passe les keys (pour cela, tu pourrais utiliser l'ellipse).

    ca donnerais un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    List<MultiKeyMap> mes map;
     
    // retourne le numéro de l'index
    int addIndex(int nbKeys);
     
    Object getItem(int numIndex, Object... keys);
    // on regarde si il y a le bon nombre de clés pour ce MultikeyMap
    //on retourne l'objet
     
    boolean addItem(int numIndex, Object data, Object... keys);
    // on regarde si le bon nombre de keys
    // on ajoute l'objet a l'index
    //on retourne true si ajout réussit
    C'est ce que tu veux?

  7. #7
    Membre actif
    Inscrit en
    Juillet 2007
    Messages
    456
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 456
    Points : 231
    Points
    231
    Par défaut
    Merci beaucoup pour vos réponses,

    J'ai commencé à implémenter la solution qui insère tous les couples possibles que je traite dans une MultiKeyMap. Après plusieurs réfléxions elle me semble la solution la plus simple et correspond a ce que j'aspire, même si ça va consommer à priori pas mal de mémoire, mais je crois qu'il y aura les moyens matérielles qui vont suivre.

    La solution proposé ma merill me semble aussi intéressante, j'essayerai de l'explorer et voir si ça peut coller à mon implémentation.

    en tous cas les gras merci bien pour vos retours.

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

Discussions similaires

  1. Conteneur avec plusieurs clés pour une valeur
    Par insomniak dans le forum C++
    Réponses: 6
    Dernier message: 15/10/2006, 18h18
  2. insertion dans table avec plusieurs clés étrangères
    Par philippe281281 dans le forum Administration
    Réponses: 2
    Dernier message: 14/06/2006, 18h35
  3. [hibernate] relation one-to-many avec plusieurs clés
    Par seb_fou dans le forum Hibernate
    Réponses: 6
    Dernier message: 16/03/2006, 14h47
  4. Creation d'une table avec plusieurs clés
    Par mic79 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 21/06/2005, 11h17
  5. [postgresql]creer une table avec plusieurs clés primaire??
    Par perlgirl dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/11/2004, 17h24

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