Est-il possible d'avoir un HashMap
retour d'une valeur par défaut pour toutes les clés qui ne sont pas trouvées dans l'ensemble?
java
dictionary
hashmap
Larry
la source
la source
getOrDefault()
lienRéponses:
[Mettre à jour]
Comme indiqué par d'autres réponses et commentateurs, à partir de Java 8, vous pouvez simplement appeler
Map#getOrDefault(...)
.[Original]
Il n'y a pas d'implémentation de Map qui fait exactement cela, mais il serait trivial d'implémenter la vôtre en étendant HashMap:
la source
(v == null)
à(v == null && !this.containsKey(k))
au cas où ils ajoutaient volontairement unenull
valeur. Je sais, ce n'est qu'un cas secondaire, mais l'auteur peut y tomber.!this.containsValue(null)
. C'est subtilement différent de!this.containsKey(k)
. LacontainsValue
solution échouera si une autre clé a été explicitement affectée à la valeurnull
. Par exemple:map = new HashMap(); map.put(k1, null); V v = map.get(k2);
dans ce cas,v
sera toujoursnull
, correct?Dans Java 8, utilisez Map.getOrDefault . Il prend la clé et la valeur à renvoyer si aucune clé correspondante n'est trouvée.
la source
getOrDefault
est très agréable, mais nécessite la définition par défaut à chaque fois que la carte est accédée. La définition unique d'une valeur par défaut aurait également des avantages de lisibilité lors de la création d'une carte statique de valeurs.private static String get(Map map, String s) { return map.getOrDefault(s, "Error"); }
Utilisez DefaultedMap de Commons si vous n'avez pas envie de réinventer la roue, par exemple,
Vous pouvez également transmettre une carte existante si vous n'êtes pas en charge de la création de la carte en premier lieu.
la source
Java 8 a introduit une belle méthode par défaut computeIfAbsent pour l'
Map
interface qui stocke la valeur calculée paresseusement et ne rompt donc pas le contrat de carte:Origine: http://blog.javabien.net/2014/02/20/loadingcache-in-java-8-without-guava/
Disclamer: Cette réponse ne correspond pas exactement à ce que OP a demandé, mais peut être pratique dans certains cas, correspondre au titre de la question lorsque le nombre de clés est limité et que la mise en cache de différentes valeurs serait rentable. Il ne devrait pas être utilisé dans le cas contraire avec beaucoup de clés et la même valeur par défaut car cela gaspillerait inutilement de la mémoire.
la source
Ne pouvez-vous pas simplement créer une méthode statique qui fait exactement cela?
la source
Vous pouvez simplement créer une nouvelle classe qui hérite de HashMap et ajouter la méthode getDefault. Voici un exemple de code:
Je pense que vous ne devriez pas surcharger la méthode get (K key) dans votre implémentation, à cause des raisons spécifiées par Ed Staub dans son commentaire et parce que vous allez rompre le contrat de l'interface Map (cela peut potentiellement conduire à des problèmes difficiles à trouver Bugs).
la source
get
méthode. D'autre part, votre solution ne permet pas d'utiliser la classe via l'interface, ce qui peut souvent être le cas.Utilisation:
la source
Il le fait par défaut. Il revient
null
.la source
HashMap
- classer juste pour cette fonctionnalité quandnull
c'est parfaitement bien.NullObject
modèle, cependant, ou si vous ne voulez pas disperser des vérifications nulles dans votre code - un désir que je comprends parfaitement.Sur java 8+
la source
J'ai trouvé la LazyMap très utile.
Cela vous permet de faire quelque chose comme ceci:
L'appel à
get
crée une valeur par défaut pour la clé donnée. Vous spécifiez comment créer la valeur par défaut avec l'argument de fabrique àLazyMap.lazyMap(map, factory)
. Dans l'exemple ci-dessus, la carte est initialisée à un nouveauAtomicInteger
avec la valeur 0.la source
List<String>
- en utilisant la réponse acceptée, je risquerais d'utiliser la même liste pour chaque nouvelle clé, plutôt que (disons) unenew ArrayList<String>()
d'une usine.Pas directement, mais vous pouvez étendre la classe pour modifier sa méthode get. Voici un exemple prêt à l'emploi: http://www.java2s.com/Code/Java/Collections-Data-Structure/ExtendedVersionofjavautilHashMapthatprovidesanextendedgetmethodaccpetingadefaultvalue.htm
la source
Exemple d'utilisation:
la source
J'avais besoin de lire les résultats renvoyés par un serveur en JSON où je ne pouvais pas garantir que les champs seraient présents. J'utilise la classe org.json.simple.JSONObject qui est dérivée de HashMap. Voici quelques fonctions d'aide que j'ai employées:
la source
Dans les projets mixtes Java / Kotlin, considérez également Map.withDefault de Kotlin .
la source