Suche…


Einführung

Ein SparseArray ist eine Alternative für eine Map . Eine Map erfordert, dass ihre Schlüssel Objekte sind. Das Phänomen des Autoboxings tritt auf, wenn wir einen primitiven int Wert als Schlüssel verwenden wollen. Der Compiler konvertiert primitive Werte automatisch in ihre geschachtelten Typen (z. B. int in Integer ). Der Unterschied beim Speicherbedarf ist spürbar: int verwendet 4 Byte, Integer 16 Byte. Ein SparseArray verwendet int als Schlüsselwert.

Bemerkungen

Vorteil :

  • Weniger Speicherbedarf (aufgrund der primitiven Schlüssel).
  • Kein Auto-Boxen.

Nachteil:

  • SparseArray verwendet die binäre Suche nach dem Suchwert (O (log n)). Daher ist es möglicherweise nicht die beste Lösung, wenn mit einer großen Anzahl von Elementen gearbeitet werden muss (verwenden Sie HashMap).

Es gibt verschiedene Varianten der Familie: -SparseArray <Integer, Object> -SparseBooleanArray <Integer, Boolean> -SparseIntArray <Integer, Integer> -SparseLongArray <Integer, Long> -LongSparseArray <Long, Object> -LongSparseLongArray <Long, Long >

SparseArray-Operationen

  • Element hinzufügen - put (int, x): Fügt dem angegebenen Wert eine Zuordnung vom angegebenen Schlüssel hinzu, wobei die vorherige Zuordnung vom angegebenen Schlüssel ersetzt wird, falls vorhanden. - append (int, x): Fügt ein Schlüssel / Wert-Paar in das Array ein und optimiert für den Fall, dass der Schlüssel größer ist als alle vorhandenen Schlüssel im Array. Bei sequentiellen Schlüsseln sollten Sie append () verwenden, um die Leistung zu optimieren. Ansonsten ist put () in Ordnung.

  • Element entfernen - delete (int): Entfernt die Zuordnung aus dem angegebenen Schlüssel, falls vorhanden. - removeAt (int): Entfernt die Zuordnung am angegebenen Index. - removeAtRange (int, int): Entfernt einen Zuordnungsbereich als Stapel.

  • Zugriff auf Element - get (int): Ruft das vom angegebenen Schlüssel zugeordnete int oder 0 ab, wenn keine solche Zuordnung vorgenommen wurde. - get (int, E): Ruft das vom angegebenen Schlüssel zugeordnete int oder den angegebenen Wert ab, wenn keine solche Zuordnung vorgenommen wurde. - valueAt (int): Gibt einen Index im Bereich 0 ... size () - 1 zurück, gibt den Wert aus der indexten Schlüsselwertzuordnung zurück, die dieser SparseIntArray speichert. Indizes werden aufsteigend sortiert.

  • index / key search - keyAt (int): Gibt einen Index im Bereich 0 ... size () - 1 zurück, gibt er den Schlüssel aus der indexten Schlüsselwertzuordnung zurück, die dieser SparseIntArray speichert. Indizes werden aufsteigend sortiert. - valueAt (int): Gibt einen Index im Bereich 0 ... size () - 1 zurück, gibt den Wert aus der indexten Schlüsselwertzuordnung zurück, die dieser SparseIntArray speichert. Indizes werden aufsteigend sortiert. - indexOfKey (int): Gibt den Index zurück, für den keyAt (int) den angegebenen Schlüssel zurückgeben würde, oder eine negative Zahl, wenn der angegebene Schlüssel nicht zugeordnet ist. - indexOfValue (E): Gibt einen Index zurück, für den valueAt (int) den angegebenen Schlüssel zurückgeben würde, oder eine negative Zahl, wenn dem angegebenen Wert keine Schlüssel zugeordnet sind. Beachten Sie, dass dies eine lineare Suche ist, im Gegensatz zu Suchvorgängen nach Schlüsseln, und dass mehrere Schlüssel auf denselben Wert abgebildet werden können. Dadurch wird nur einer von ihnen gefunden. Der Unterschied im Speicherbedarf ist auffällig: Das int verwendet 4 Bytes, die Integer verwendet 16 Bytes. ParseArray verwendet int als Schlüsselwert.

Ein einfaches Beispiel mit 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);

Tutorial auf YouTube



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow