Szukaj…


Wprowadzenie

SparseArray jest alternatywą dla Map . Map wymaga, aby klucze były obiektami. Zjawisko autoboxowania występuje, gdy chcemy użyć pierwotnej wartości int jako klucza. Kompilator automatycznie konwertuje wartości pierwotne na typy pudełkowe (np. int na Integer ). Widoczna jest różnica w powierzchni pamięci: int używa 4 bajtów, Integer używa 16 bajtów. SparseArray używa int jako wartości klucza.

Uwagi

Zaleta:

  • Mniejsze zużycie pamięci (ze względu na prymitywne klucze).
  • Bez automatycznego boksu.

Wada:

  • SparseArray używa wyszukiwania binarnego dla szukanej wartości (O (log n)), więc może nie być najlepszym rozwiązaniem, jeśli musi pracować z dużą liczbą elementów (użyj HashMap).

Istnieje kilka wariantów rodziny, takich jak: -SparseArray <Integer, Object> -SparseBooleanArray <Integer, Boolean> -SparseIntArray <Integer, Integer> -SparseLongArray <Integer, Long> -LongSparseArray <Long, Object> -LongSparseLongArray <Long, Object> -LongSparseLongArray >

Operacje SparseArray

  • add element - put (int, x): Dodaje mapowanie z określonego klucza do określonej wartości, zastępując poprzednie mapowanie z określonego klucza, jeśli taki istnieje. - append (int, x): Umieszcza parę klucz / wartość w tablicy, optymalizując dla przypadku, gdy klucz jest większy niż wszystkie istniejące klucze w tablicy. Należy użyć append () w przypadku kluczy sekwencyjnych, aby zoptymalizować wydajność. W przeciwnym razie put () jest w porządku.

  • remove element - delete (int): Usuwa mapowanie z określonego klucza, jeśli taki istnieje. - removeAt (int): Usuwa mapowanie pod podanym indeksem. - removeAtRange (int, int): usuwa zakres mapowań jako partia.

  • accessing element - get (int): Pobiera liczbę int zamapowaną z określonego klucza lub 0, jeśli takie mapowanie nie zostało wykonane. - get (int, E): Pobiera liczbę int odwzorowaną z określonego klucza lub określoną wartość, jeśli takie mapowanie nie zostało wykonane. - valueAt (int): Biorąc pod uwagę indeks z zakresu 0 ... size () - 1, zwraca wartość z indeksu mapowania klucz-wartość, który przechowuje ten SparseIntArray. Indeksy są uporządkowane rosnąco.

  • wyszukiwanie indeksu / klucza - keyAt (int): Biorąc pod uwagę indeks z zakresu 0 ... rozmiar () - 1, zwraca klucz z indeksu mapowania klucz-wartość przechowywanego w tym SparseIntArray. Indeksy są uporządkowane rosnąco. - valueAt (int): Biorąc pod uwagę indeks z zakresu 0 ... size () - 1, zwraca wartość z indeksu mapowania klucz-wartość, który przechowuje ten SparseIntArray. Indeksy są uporządkowane rosnąco. - indexOfKey (int): Zwraca indeks, dla którego keyAt (int) zwróci określony klucz lub liczbę ujemną, jeśli określony klucz nie zostanie zmapowany. - indexOfValue (E): Zwraca indeks, dla którego wartośćAt (int) zwraca określony klucz lub liczbę ujemną, jeśli żaden klucz nie jest odwzorowany na określoną wartość. Uważaj, że jest to wyszukiwanie liniowe, w przeciwieństwie do wyszukiwania według klucza, i że wiele kluczy może odwzorować na tę samą wartość, a to znajdzie tylko jeden z nich. Widoczna jest różnica w ich obszarze pamięci: int używa 4 bajtów, Integer używa 16 bajtów. ParseArray używa int jako wartości klucza.

Podstawowy przykład z wykorzystaniem SparseArray

class Person {
    String name;

    public Person(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Person person = (Person) o;

        return name != null ? name.equals(person.name) : person.name == null;
    }

    @Override
    public int hashCode() {
        return name != null ? name.hashCode() : 0;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                '}';
    }
}

final Person steve = new Person("Steve");
Person[] persons = new Person[] { new Person("John"), new Person("Gwen"), steve, new Person("Rob") };
int[] identifiers = new int[] {1234, 2345, 3456, 4567};

final SparseArray<Person> demo = new SparseArray<>();

// Mapping persons to identifiers.
for (int i = 0; i < persons.length; i++) {
    demo.put(identifiers[i], persons[i]);
}

// Find the person with identifier 1234.
Person id1234 = demo.get(1234); // Returns John.

// Find the person with identifier 6410.
Person id6410 = demo.get(6410); // Returns null.

// Find the 3rd person.
Person third = demo.valueAt(3); // Returns Rob.

// Find the 42th person.
//Person fortysecond = demo.valueAt(42); // Throws ArrayIndexOutOfBoundsException.

// Remove the last person.
demo.removeAt(demo.size() - 1); // Rob removed.

// Remove the person with identifier 1234.
demo.delete(1234); // John removed.

// Find the index of Steve.
int indexOfSteve = demo.indexOfValue(steve);

// Find the identifier of Steve.
int identifierOfSteve = demo.keyAt(indexOfSteve);

Samouczek na YouTube



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow