Sök…


Introduktion

En SparseArray är ett alternativ för en Map . En Map kräver att dess nycklar är objekt. Fenomenet med autoboxing inträffar när vi vill använda ett primitivt int värde som nyckel. Kompilatorn konverterar automatiskt primitiva värden till sina boxade typer (t.ex. int till Integer ). Skillnaden i minnesfotavtryck märks: int använder 4 byte, Integer använder 16 byte. En SparseArray använder int som nyckelvärde.

Anmärkningar

Fördel:

  • Mindre minnesanvändning (på grund av de primitiva knapparna).
  • Ingen automatisk boxning.

Nackdel:

  • SparseArray använder binär sökning för sökvärde (O (log n)), så det kanske inte är den bästa lösningen om man måste arbeta med ett stort antal element (använd HashMap).

Det finns flera varianter av familjen: >

SparseArray-operationer

  • lägga till element - put (int, x): Lägger till en mappning från den angivna nyckeln till det angivna värdet och ersätter den tidigare mappningen från den angivna nyckeln om det fanns en. - bifoga (int, x): Sätter ett nyckel- / värdepar i matrisen, optimerar för det fall där nyckeln är större än alla befintliga nycklar i matrisen. Du bör använda append () vid sekvensnycklar för att optimera prestanda. Annars är det bra att sätta ().

  • ta bort element - ta bort (int): Tar bort mappningen från den angivna nyckeln, om det fanns något. - removeAt (int): Tar bort kartläggningen vid det givna indexet. - removeAtRange (int, int): Ta bort en rad mappningar som en batch.

  • åtkomstelement - get (int): Hämtar int-mappningen från den angivna nyckeln, eller 0 om ingen sådan mappning har gjorts. - get (int, E): Hämtar int-mappningen från den angivna nyckeln eller det angivna värdet om ingen sådan mappning har gjorts. - valueAt (int): Givet ett index i intervallet 0 ... storlek () - 1, returnerar värdet från den indexerade nyckelvärdekartläggningen som denna SparseIntArray lagrar. Index beställs i stigande ordning.

  • index / nyckelsökning - keyAt (int): Givet ett index i intervallet 0 ... storlek () - 1, returnerar nyckeln från den indexerade nyckelvärdekartläggningen som denna SparseIntArray lagrar. Index beställs i stigande ordning. - valueAt (int): Givet ett index i intervallet 0 ... storlek () - 1, returnerar värdet från den indexerade nyckelvärdekartläggningen som denna SparseIntArray lagrar. Index beställs i stigande ordning. - indexOfKey (int): Returnerar indexet för vilket keyAt (int) skulle returnera den angivna nyckeln, eller ett negativt nummer om den angivna nyckeln inte är mappad. - indexOfValue (E): Returnerar ett index för vilket värdeAt (int) skulle returnera den angivna nyckeln, eller ett negativt tal om inga nycklar kartlägger det angivna värdet. Se upp för att detta är en linjär sökning, till skillnad från sökningar efter nyckel, och att flera nycklar kan kartlägga till samma värde och det finns bara en av dem. Skillnaden i deras minnesfotavtryck märks: int använder 4 byte, heltalet använder 16 byte.SparseArray använder int som nyckelvärde.

Grundläggande exempel med 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);

Handledning på YouTube



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow