Est-il possible pour nous d'implémenter un HashMap avec une clé et deux valeurs. Tout comme HashMap?
S'il vous plaît, aidez-moi, en disant également (s'il n'y a aucun moyen) une autre façon d'implémenter le stockage de trois valeurs avec une comme clé?
Réponses:
Vous pourriez:
Map<KeyType, List<ValueType>>
.Map<KeyType, WrapperType>
.Map<KeyType, Tuple<Value1Type, Value2Type>>
.Exemples
1. Carte avec liste comme valeur
L'inconvénient de cette approche est que la liste n'est pas liée à exactement deux valeurs.
2. Utilisation de la classe wrapper
L'inconvénient de cette approche est que vous devez écrire beaucoup de code de plaque chauffante pour toutes ces classes de conteneurs très simples.
3. Utiliser un tuple
C'est la meilleure solution à mon avis.
4. Plusieurs cartes
L'inconvénient de cette solution est qu'il n'est pas évident que les deux cartes soient liées, une erreur de programmation pourrait voir les deux cartes se désynchroniser.
la source
Map<KeyType, Tuple<Value1Type, Value2Type>>
Non, pas seulement en tant que
HashMap
. Vous auriez essentiellement besoinHashMap
d'une clé à une collection de valeurs.Si vous êtes heureux d'utiliser des bibliothèques externes, Guava a exactement ce concept
Multimap
avec des implémentations telles queArrayListMultimap
etHashMultimap
.la source
ArrayListMultimap
vous ... ou utilisez simplement unHashMap<String, List<Integer>>
ou autre chose. Vous devez créer une liste vide chaque fois qu'une valeur est ajoutée pour la première fois, en gros.HashMap<String, List<Integer>>
Un autre bon choix est d'utiliser MultiValuedMap d'Apache Commons. Jetez un œil aux classes d'implémentation connues en haut de la page pour les implémentations spécialisées.
Exemple:
pourrait être remplacé par
Alors,
entraînerait une collection
coll
contenant "A", "B" et "C".la source
Jetez un œil aux
Multimap
bibliothèques de goyaves et à leur mise en œuvre -HashMultimap
la source
J'utilise
Map<KeyType, Object[]>
pour associer plusieurs valeurs à une clé dans une carte. De cette façon, je peux stocker plusieurs valeurs de différents types associées à une clé. Vous devez faire attention en maintenant un ordre correct d'insertion et de récupération à partir de l'objet [].Exemple: Considérez, nous voulons stocker les informations des étudiants. La clé est l'identifiant, alors que nous aimerions stocker le nom, l'adresse et l'e-mail associés à l'étudiant.
la source
la source
Juste pour mémoire, la solution pure JDK8 serait d'utiliser la
Map::compute
méthode:Tel que
avec sortie:
Notez que pour garantir la cohérence dans le cas où plusieurs threads accèdent à cette structure de données
ConcurrentHashMap
etCopyOnWriteArrayList
doivent par exemple être utilisés.la source
computeIfAbsent
.map.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
Si vous utilisez Spring Framework . Il y a:
org.springframework.util.MultiValueMap
.Pour créer une carte multi-valeurs non modifiable:
Ou utiliser
org.springframework.util.LinkedMultiValueMap
la source
Oui et non. La solution consiste à créer un clas Wrapper pour vos valeurs qui contient les 2 (3 ou plus) valeurs qui correspondent à votre clé.
la source
Oui, ceci est souvent appelé a
multimap
.Voir: http://google-collections.googlecode.com/svn/trunk/javadoc/index.html?com/google/common/collect/Multimap.html
la source
Le moyen le plus simple serait d'utiliser une bibliothèque de collections Google:
lien maven: https://mvnrepository.com/artifact/com.google.collections/google-collections/1.0-rc2
plus à ce sujet: http://tomjefferys.blogspot.be/2011/09/multimaps-google-guava.html
la source
J'ai les meilleurs résultats.
Il vous suffit de créer de nouveaux
HashMap
commedans votre
for
boucle. Il aura le même effet que la même clé et plusieurs valeurs.la source
Production:
Il s'agit de la bibliothèque Google-Guava pour les fonctionnalités utilitaires. C'est la solution requise.
la source
Je n'ai pas pu poster de réponse sur le commentaire de Paul, je crée donc un nouveau commentaire pour Vidhya ici:
Wrapper sera un
SuperClass
pour les deux classes que nous voulons stocker en tant que valeur.et à l'intérieur de la classe wrapper, nous pouvons mettre les associations comme objets variables d'instance pour les deux objets de classe.
par exemple
et dans HashMap nous pouvons mettre de cette façon,
WrapperObj aura des variables de classe:
class1Obj, class2Obj
la source
Vous pouvez le faire implicitement.
C'est très simple et efficace. Si vous souhaitez plutôt des valeurs de différentes classes, vous pouvez effectuer les opérations suivantes:
la source
Peut être fait en utilisant une identité HashMap, soumise à la condition que la comparaison des clés soit effectuée par l'opérateur == et non égal ().
la source
Je préfère ce qui suit pour stocker un certain nombre de variables sans avoir à créer une classe distincte.
la source
Je suis tellement habitué à le faire avec un dictionnaire de données dans l'objectif C. Il était plus difficile d'obtenir un résultat similaire dans Java pour Android. J'ai fini par créer une classe personnalisée, puis en faisant simplement une table de hachage de ma classe personnalisée.
la source
Nous pouvons créer une classe pour avoir plusieurs clés ou valeurs et l'objet de cette classe peut être utilisé comme paramètre dans la carte. Vous pouvez vous référer à https://stackoverflow.com/a/44181931/8065321
la source
Utilisation de Java Collectors
où le département est votre clé
la source
Essayez LinkedHashMap , exemple:
production:
la source
linked
n'existera plus sur la carte car vous l'avez remplacée parhash
.