J'ai des données qui sont organisées dans une sorte de format "clé-clé", plutôt que "clé-valeur". C'est comme un HashMap, mais j'aurai besoin d'une recherche O (1) dans les deux sens. Existe-t-il un nom pour ce type de structure de données, et est-ce que quelque chose de similaire est inclus dans les bibliothèques standard de Java? (ou peut-être Apache Commons?)
Je pourrais écrire ma propre classe qui utilise essentiellement deux cartes en miroir, mais je préfère ne pas réinventer la roue (si cela existe déjà mais je ne cherche tout simplement pas le bon terme).
En plus d'Apache Commons, Guava dispose également d'une BiMap .
la source
Voici une classe simple que j'ai utilisée pour faire cela (je ne voulais pas avoir encore une autre dépendance tierce). Il n'offre pas toutes les fonctionnalités disponibles dans Maps mais c'est un bon début.
la source
Si aucune collision ne se produit, vous pouvez toujours ajouter les deux directions au même HashMap :-)
la source
Voici mes 2 cents.
Ou vous pouvez utiliser une méthode simple avec des génériques. Part de gâteau.
Bien sûr, vous devez avoir une carte avec des valeurs uniques. Sinon, l'un d'entre eux sera remplacé.
la source
Inspiré par la réponse de GETah, j'ai décidé d'écrire quelque chose de similaire par moi-même avec quelques améliorations:
Map<K,V>
-Interfaceput
(du moins j'espère le garantir par la présente)L'utilisation est comme une carte normale, pour obtenir une vue inversée de l'appel de cartographie
getReverseView()
. Le contenu n'est pas copié, seule une vue est renvoyée.Je ne suis pas sûr que ce soit totalement infaillible (en fait, ce n'est probablement pas le cas), alors n'hésitez pas à commenter si vous remarquez des défauts et je mettrai à jour la réponse.
la source
Une question assez ancienne ici, mais si quelqu'un d'autre a un bloc cérébral comme je viens de le faire et tombe dessus, j'espère que cela aidera.
Moi aussi je cherchais un HashMap bidirectionnel, parfois c'est la plus simple des réponses qui est la plus utile.
Si vous ne souhaitez pas réinventer la roue et préférez ne pas ajouter d'autres bibliothèques ou projets à votre projet, que diriez-vous d'une simple implémentation de tableaux parallèles (ou ArrayLists si votre conception l'exige).
Dès que vous connaissez l'index de l'une des deux clés, vous pouvez facilement demander l'autre. Ainsi, vos méthodes de recherche pourraient ressembler à quelque chose comme:
Cela suppose que vous utilisez des structures orientées objet appropriées, où seules les méthodes modifient ces tableaux / ArrayLists, il serait très simple de les garder parallèles. Encore plus facile pour une ArrayList puisque vous n'auriez pas à reconstruire si la taille des tableaux change, tant que vous ajoutez / supprimez en tandem.
la source