Je veux avoir une carte avec des clés en double.
Je sais qu'il existe de nombreuses implémentations de carte (Eclipse m'en montre environ 50), donc je parie qu'il doit y en avoir une qui le permet. Je sais qu'il est facile d'écrire votre propre carte pour cela, mais je préférerais utiliser une solution existante.
Peut-être quelque chose dans les collections communes ou les collections google?
java
duplicates
guava
multimap
IAdapter
la source
la source
Réponses:
Vous recherchez un multimap, et en effet, les collections communes et Guava ont plusieurs implémentations pour cela. Les multimaps permettent plusieurs clés en conservant une collection de valeurs par clé, c'est-à-dire que vous pouvez placer un seul objet dans la carte, mais vous en récupérez une collection.
Si vous pouvez utiliser Java 5, je préférerais Guava
Multimap
car il est compatible avec les génériques.la source
com.google.common.collect.HashMultimap
areadObject
/writeObject
methods, tout comme ArrayListMultimap et Immutable {List, Set} Multimap. Je considérerais une instance désérialisée inutile comme un bogue qui mérite d'être signalé.Nous n'avons pas besoin de dépendre de la bibliothèque externe Google Collections. Vous pouvez simplement implémenter la carte suivante:
Veuillez vous assurer d'affiner le code.
la source
La sortie est:
Remarque: nous devons importer des fichiers de bibliothèque.
http://www.java2s.com/Code/Jar/g/Downloadgooglecollectionsjar.htm
ou https://commons.apache.org/proper/commons-collections/download_collections.cgi
la source
Vous pourriez simplement passer un tableau de valeurs pour la valeur dans un HashMap normal, simulant ainsi des clés en double, et ce serait à vous de décider quelles données utiliser.
Vous pouvez également utiliser simplement une MultiMap , même si je n'aime pas l'idée de dupliquer les clés moi-même.
la source
TreeMap<String, ArrayList<MyClass>>
résolu mes besoins en double clé.Si vous voulez parcourir une liste de paires clé-valeur (comme vous l'avez écrit dans le commentaire), alors une liste ou un tableau devrait être mieux. Combinez d'abord vos clés et vos valeurs:
Remplacez Class1 et Class2 par les types que vous souhaitez utiliser pour les clés et les valeurs.
Vous pouvez maintenant les mettre dans un tableau ou une liste et les parcourir:
la source
Ce problème peut être résolu avec une liste d'entrées de carte
List<Map.Entry<K,V>>
. Nous n'avons pas besoin d'utiliser ni de bibliothèques externes ni de nouvelle implémentation de Map. Une entrée de carte peut être créée comme ceci:Map.Entry<String, Integer> entry = new AbstractMap.SimpleEntry<String, Integer>("key", 1);
la source
la source
Apprenez de mes erreurs ... s'il vous plaît, ne mettez pas cela en œuvre vous-même. Guava multimap est la voie à suivre.
Une amélioration courante requise dans les multi-cartes consiste à interdire les paires clé-valeur en double.
Mettre en œuvre / modifier cela dans votre implémentation peut être ennuyeux.
Dans Guava, c'est aussi simple que:
la source
J'avais une variante légèrement différente de ce problème: il était nécessaire d'associer deux valeurs différentes à la même clé. Juste en le publiant ici au cas où cela aiderait les autres, j'ai introduit un HashMap comme valeur:
Dans le code ci-dessus, la clé frameID est lue à partir de la première chaîne d'un fichier d'entrée dans chaque ligne, la valeur de frameTypeHash est construite en divisant la ligne restante et a été stockée en tant qu'objet String à l'origine, sur une période de temps le fichier a commencé à avoir plusieurs lignes ( avec des valeurs différentes) associée à la même clé frameID, donc frameTypeHash a été écrasé par la dernière ligne comme valeur. J'ai remplacé l'objet String par un autre objet HashMap comme champ de valeur, cela a aidé à maintenir une clé unique vers un mappage de valeurs différentes.
la source
Aucune bibliothèque sophistiquée requise. Les cartes sont définies par une clé unique, alors ne les pliez pas, utilisez une liste. Les ruisseaux sont puissants.
Et c'est tout. Exemples d'utilisation:
la source
la source
java-map-duplicate-keys
la source
qu'en est-il d'un tel impl MultiMap?
la source
Pourriez-vous également expliquer le contexte pour lequel vous essayez d'implémenter une carte avec des clés en double? Je suis sûr qu'il pourrait y avoir une meilleure solution. Les cartes sont destinées à conserver des clés uniques pour une bonne raison. Mais si vous vouliez vraiment le faire; vous pouvez toujours étendre la classe en écrivant une classe de carte personnalisée simple qui a une fonction d'atténuation des collisions et vous permettrait de conserver plusieurs entrées avec les mêmes clés.
Remarque: vous devez implémenter la fonction d'atténuation des collisions de telle sorte que les clés en collision soient converties en un ensemble unique "toujours". Quelque chose de simple comme, ajouter une clé avec un hashcode d'objet ou quelque chose?
la source
juste pour être complet, Apache Commons Collections a également une MultiMap . L'inconvénient est bien sûr qu'Apache Commons n'utilise pas les génériques.
la source
Avec un peu de hack, vous pouvez utiliser HashSet avec des clés en double. AVERTISSEMENT: cela dépend fortement de l'implémentation HashSet.
la source
S'il existe des clés en double, une clé peut correspondre à plus d'une valeur. La solution évidente consiste à mapper la clé à une liste de ces valeurs.
Par exemple en Python:
la source
J'ai utilisé ceci:
java.util.List<java.util.Map.Entry<String,Integer>> pairList= new java.util.ArrayList<>();
la source