2012-09-15 17 views
30

que estaba llevando a cabo una memoria caché de mapa de bits utilizando un HashMap<Integer, Bitmap> y recibió la siguiente advertencia en Eclipse:SparseArray, comprobar si la clave existe

Uso SparseArray nueva (...) en lugar de un mejor rendimiento.

nunca he oído hablar de esa clase antes, pero la inspección que no parece tener un método containsKey() la que estaba llamando en la recuperación de un mapa de bits de la memoria caché para comprobar si existe en la memoria caché, y si no es así, agrégalo.

¿Alguna idea sobre la mejor manera de verificar si la clave ya existe?

Supongo que podría cambiar el código para usar esta sobrecarga y comprobar si no existe?

Bitmap bitmap = cache.get(key, null); 

Respuesta

39

que puede usar:

Bitmap bitmap = cache.get(key, null); 

Pero entender que esto es lo mismo que get(key):

Bitmap bitmap = cache.get(key); 

La mejor manera de utilizar get(key, default) es proporcionar un caso genérico predeterminado, algo que es un sustituto válido cuando no se encuentra la clave.

Pero no hay una buena razón para no usar if(get(key) != null) como reemplazo rápido para .

+0

Gracias Sam, buen lugar en la sobrecarga, he ido con tu sugerencia de reemplazar con if (get (key)! = Null). – magritte

1

Citando de documentation.

SparseArrays mapas enteros a Objetos. A diferencia de una matriz normal de Objetos, puede haber lagunas en los índices. Se pretende que sea más eficiente que usar un HashMap para mapear enteros a objetos.

Puede usar get(int) que también devolverá nulo si no se encuentra la clave. Me gusta;

Mapa de bits bitmap = cache.get (clave);

+0

La clave puede tener valor nulo, en ese caso con su código no podrá determinar si la clave existe o no. es decir, si la clave no existe, devolverá nulo y si la clave tiene valor nulo también devolverá nulo. indexOfKey debe ser usuario en este caso (Ver la respuesta de Alex) – user1991679

+0

@ user1991679 bastante vieja respuesta y lo que sugieres es supongo a través de nuevas API. Sin embargo, la respuesta a su comentario es que int primitive no puede ser nulo. – auselen

+0

No entiendo cómo el hecho de que primitiva no se puede relacionar nulo con mi comentario. Por cierto, indexOfKey se introdujo en la API 1. – user1991679

26

Por lo tanto, su valor puede ser nulo en varias situaciones, sugiero usar indexOfKey(int key) Aquí está la referencia indexOfKey(int key).

Entonces simplemente comprobar si hay valor de retorno negativo

if(mySparseArray.indexOfKey(int) < 0) { 
    //Item does not exist. Do something relevant 
} 
+0

¿Es esto mejor/peor que simplemente usar '.get'? – Smar

1

A juzgar por la implementación de SparseArray parece contrario a la intuición de que puede tener un mejor rendimiento (tiempo-complejidad) que HashMap (que no sea menor espacio-requisito lo cual tiene sentido para un entorno móvil) ya que el miembro get() de SparseArray usa binary-search (O (log N)) mientras que para HashMap usa indexación de matrices (O (1)).

Proporcionar la implementación del método get() tanto para las clases (tal cual):

public V get(Object key) { // for HashMap 
    if (key == null) 
     return getForNullKey(); 
    int hash = hash(key.hashCode()); 
    for (Entry<K,V> e = table[indexFor(hash, table.length)]; 
      e != null; 
      e = e.next) { 
     Object k; 
     if (e.hash == hash && ((k = e.key) == key || key.equals(k))) 
      return e.value; 
    } 
    return null; 
} 

public E get(int key, E valueIfKeyNotFound) { //for SparseArray 
    int i = binarySearch(mKeys, 0, mSize, key); 

    if (i < 0 || mValues[i] == DELETED) { 
     return valueIfKeyNotFound; 
    } else { 
     return (E) mValues[i]; 
    } 
} 

en cuanto a si utilizar indexOfKey (clave) < 0 o conseguir (clave) == null para comprobar la existencia de clave en un SparseArray, todo está bien ya que ambos usan búsqueda binaria debajo.

public int indexOfKey(int key) { // for SparseArray 
    if (mGarbage) { 
     gc(); 
    } 

    return binarySearch(mKeys, 0, mSize, key); 
} 
+1

No puedo entender dónde está la conexión entre tu respuesta y las preguntas. –