2012-09-15 24 views
30

byłem wdrożenie cache Bitmap przy użyciu HashMap<Integer, Bitmap> i otrzymał następujące ostrzeżenie w Eclipse:SparseArray, sprawdź czy klucz istnieje

Zastosowanie nowego SparseArray (...) zamiast do lepszej wydajności.

Nigdy nie słyszałem tej klasy wcześniej, ale inspekcji to nie wydaje się mieć containsKey() metodę, która byłem wzywającą pobieranie bitmapy z pamięci podręcznej, aby sprawdzić, czy istnieje w pamięci podręcznej, a jeśli nie, to dodaj.

Wszelkie pomysły na najlepszy sposób sprawdzenia, czy klucz już istnieje?

Zgaduję, że mógłbym zmienić kod, aby użyć tego przeciążenia i sprawdzić czy jest zerowy?

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

Odpowiedz

39

Można użyć:

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

Ale rozumiem, że to jest taki sam jak get(key):

Bitmap bitmap = cache.get(key); 

Najlepszym sposobem korzystania get(key, default) jest zapewnienie rodzajowe domyślny przypadek, coś jest prawidłowym substytutem , gdy klucz nie zostanie znaleziony.

Ale nie ma dobrego powodu, aby nie używać if(get(key) != null) jako szybkiego zamiennika dla .

+0

Dzięki Sam, dobre miejsce na przeciążenie, poszedłem z twoją sugestią, aby po prostu zastąpić if (get (key)! = Null). – magritte

1

Cytowanie z documentation.

SparseArrays to liczby całkowite z obiektami. W przeciwieństwie do normalnej tablicy obiektów, mogą występować przerwy w indeksach. Ma to na celu być bardziej wydajne niż używanie HashMap do mapowania liczb całkowitych do obiektów.

Można użyć wartości get(int), która również zwróci wartość null, jeśli klucz nie zostanie znaleziony. Lubić;

Bitmap bitmap = cache.get (klucz);

+0

Klucz może mieć wartość pustą, w takim przypadku z kodem nie można ustalić, czy klucz istnieje, czy nie. to znaczy, jeśli klucz nie istnieje, zwróci wartość null, a jeśli klucz ma wartość pustą, zwróci również wartość null. indexOfKey powinien być użytkownikiem w tym przypadku (zobacz odpowiedź Alexa) – user1991679

+0

@ user1991679 dość stara odpowiedź, a sugerujesz to przez nowsze apisy. Jednak odpowiedź na Twój komentarz brzmi: prymitywalny int nie może być pusty. – auselen

+0

Nie rozumiem, w jaki sposób fakt, że prymityw nie może być pusty, jest związany z moim komentarzem. BTW, indexOfKey został wprowadzony w API 1. – user1991679

26

W związku z tym wartość może być zerowa w różnych sytuacjach, sugeruję użyć indexOfKey(int key) Oto odniesienie indexOfKey(int key).

Wtedy po prostu sprawdzić ujemnej wartości powrotnej

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

Czy jest lepiej/gorzej niż po prostu używając '.get'? – Smar

1

będzie poprzez realizację SparseArray wydaje się sprzeczne z intuicją, że może to mieć lepszą wydajność (czas złożoności) niż HashMap (inne niż dolnej czasoprzestrzeni wymogu co ma sens w przypadku środowiska mobilnego), ponieważ element get() w SparseArray używa wyszukiwania binarnego (O (log N)), podczas gdy dla HashMap korzysta z indeksowania tablicowego (O (1)).

Zapewnienie get() wdrożenie metody dla obu klas (jak jest):

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]; 
    } 
} 

, czy używać indexOfKey (key) < 0 lub get (key) == null za sprawdzanie istnienia klucza w SparseArray, wszystko jest ok, ponieważ oba używają wyszukiwania binarnego pod spodem.

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

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

Nie mogę zrozumieć, gdzie jest połączenie z odpowiedzi na pytania. –