SparseArray, vérifiez si la clé existe
J'ai été mise en œuvre d'une mémoire cache des bitmaps à l'aide d'un HashMap<Integer, Bitmap>
et a reçu l'avertissement suivant dans Eclipse:
Utiliser de nouvelles SparseArray(...) à la place pour de meilleures performances.
Je n'ai jamais entendu parler de cette classe avant, mais de l'examiner, il ne semble pas avoir un containsKey()
méthode dont j'ai été l'appelant sur la récupération d'une image Bitmap à partir du cache de vérifier s'il existe dans le cache, et si ça ne marche pas, puis l'ajouter.
Toutes les idées sur la meilleure façon de vérifier si la clé existe déjà?
Je suppose que je pourrais modifier le code pour utiliser cette surcharge et de vérifier la valeur null?
Bitmap bitmap = cache.get(key, null);
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser:
Mais de comprendre que c'est le même que
get(clé)
:La meilleure façon d'utiliser
get(key, default)
est de fournir un générique par défaut les cas, quelque chose est un substitut valable lorsque la clé n'est pas trouvée.Mais il n'y a aucune bonne raison de ne pas utiliser
if(get(key) != null)
comme un remplacement rapide pourcontains()
.Donc votre valeur peut être nulle dans diverses situations, je vous suggère d'utiliser
indexOfKey(int key)
Voici la indexOfKey(int key) de référence.
Puis il suffit de vérifier simplement négative de la valeur de retour
.get
?.get(int)
est O(1) parce que c'est la vérification de la sous-jacentes tableau directement.indexOf(int)
est O(log(n)), car il n'binaire de recherche pour trouver le bon indiceint
dansget(int)
n'est pas un indice, c'est une clé. Par conséquent, il n'est pas O(1). Les deuxget(int)
etindexOfKey(int)
ont la même complexité O(log(n)), on renvoie la valeur de la position si trouvé, null sinon, les autres ne renvoie l'index si trouvé, une valeur négative sinon.get(int)
etindexOfKey(int)
binaires de recherche. Mon erreur.Citant la documentation.
Vous pouvez utiliser get(int) qui permettrait également de retourner la valeur null si la clé n'est pas trouvée. Comme;
Passe par la mise en œuvre de SparseArray il semble contre-intuitif que cela peut avoir de meilleures performances (temps de complexité) que HashMap (autres que les bas de l'espace-exigence qui fait sens pour un environnement mobile) depuis le get() membre de SparseArray utilise les binaires de recherche (O(log N)), alors que pour la table de hachage utilise le tableau d'indexation(O(1)).
Fournir la méthode get() de la mise en œuvre pour les deux classes (as-is):
quant à l'utilisation indexOfKey(clé) < 0 ou get(clé) == null pour vérifier l'existence d'une clé dans un SparseArray, tout est ok, puisque à la fois utiliser les binaires de recherche-dessous.
De multiples façons:
Si vous souhaitez utiliser la valeur associée à la clé de toute façon, vous pouvez utiliser
get()
:Noter que contrairement à ce que l'IDE pense, il peut être nulle, ce qui est pourquoi j'ai ajouté
?
.si vous voulez juste pour vérifier si elle existe, vous pouvez utiliser
indexOfKey(key) >= 0
Si vous n'aimez pas la-dessus, et que vous voulez un plus lisible option, vous pouvez utiliser
containsKey
de la ktx-collection de dépendance:Utilisation: