Android
Hoe SparseArray te gebruiken
Zoeken…
Invoering
Een SparseArray
is een alternatief voor een Map
. Een Map
vereist dat de sleutels objecten zijn. Het fenomeen van autoboxing doet zich voor wanneer we een primitieve int
waarde als sleutel willen gebruiken. De compiler converteert automatisch primitieve waarden naar hun boxtypes (bijv. int
naar Integer
). Het verschil in geheugenvoetafdruk is merkbaar: int
gebruikt 4 bytes, Integer
gebruikt 16 bytes. Een SparseArray
gebruikt int
als sleutelwaarde.
Opmerkingen
Voordeel:
- Minder geheugengebruik (vanwege de primitieve sleutels).
- Geen automatisch boksen.
Nadeel:
- SparseArray maakt gebruik van binair zoeken naar vindwaarde (O (log n)), dus het is misschien niet de beste oplossing als het moet werken met een groot aantal elementen (gebruik HashMap).
Er zijn verschillende varianten van de familie zoals: -SparseArray <Integer, Object> -SparseBooleanArray <Integer, Boolean> -SparseIntArray <Integer, Integer> -SparseLongArray <Integer, Long> -LongSparseArray <Long, Object> -LongSparseLongArray <Long, Long >
SparseArray-bewerkingen
element toevoegen - put (int, x): voegt een toewijzing van de opgegeven sleutel toe aan de opgegeven waarde, waarbij de vorige toewijzing van de opgegeven sleutel wordt vervangen als die er was. - append (int, x): hiermee wordt een sleutel / waarde-paar in de array geplaatst, waarbij wordt geoptimaliseerd voor het geval dat de sleutel groter is dan alle bestaande sleutels in de array. Gebruik append () in het geval van opeenvolgende sleutels om de prestaties te optimaliseren. Anders is put () prima.
element verwijderen - delete (int): verwijdert de toewijzing van de opgegeven sleutel, indien aanwezig. - removeAt (int): verwijdert de toewijzing bij de gegeven index. - removeAtRange (int, int): verwijder een reeks toewijzingen als batch.
accessing element - get (int): haalt de int toegewezen uit de opgegeven sleutel, of 0 als er geen dergelijke mapping is gemaakt. - get (int, E): haalt de int toegewezen uit de gespecificeerde sleutel, of de gespecificeerde waarde als er geen dergelijke mapping is gemaakt. - valueAt (int): Gegeven een index in het bereik 0 ... size () - 1, retourneert de waarde van de indexe sleutel / waarde-toewijzing die deze SparseIntArray opslaat. Indices worden in oplopende volgorde geordend.
index / key search - keyAt (int): Gegeven een index in het bereik 0 ... size () - 1, retourneert de sleutel uit de indexth key-value mapping die deze SparseIntArray opslaat. Indices worden in oplopende volgorde geordend. - valueAt (int): Gegeven een index in het bereik 0 ... size () - 1, retourneert de waarde van de indexe sleutel / waarde-toewijzing die deze SparseIntArray opslaat. Indices worden in oplopende volgorde geordend. - indexOfKey (int): Retourneert de index waarvoor keyAt (int) de opgegeven sleutel retourneert, of een negatief getal als de opgegeven sleutel niet wordt toegewezen. - indexOfValue (E): Retourneert een index waarvoor valueAt (int) de opgegeven sleutel zou retourneren, of een negatief getal als er geen sleutels zijn toegewezen aan de opgegeven waarde. Houd er rekening mee dat dit een lineaire zoekopdracht is, in tegenstelling tot zoekopdrachten per sleutel, en dat meerdere sleutels kunnen worden toegewezen aan dezelfde waarde en dit zal er slechts één vinden. Het verschil in geheugenafdruk is merkbaar: int gebruikt 4 bytes, integer gebruikt 16 bytes.SparseArray gebruikt int als sleutelwaarde.
Basisvoorbeeld met 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);