Buscar..


Introducción

Un SparseArray es una alternativa para un Map . Un Map requiere que sus claves sean objetos. El fenómeno del autoboxing ocurre cuando queremos usar un valor int primitivo como clave. El compilador convierte automáticamente los valores primitivos a sus tipos encajonados (por ejemplo, int a Integer ). La diferencia en la huella de memoria es notable: int usa 4 bytes, Integer usa 16 bytes. Un SparseArray utiliza int como valor clave.

Observaciones

Ventaja:

  • Menor uso de memoria (por las claves primitivas).
  • No hay auto-boxeo.

Desventaja:

  • SparseArray usa la búsqueda binaria para encontrar el valor (O (log n)), por lo que puede que no sea la mejor solución si tiene que trabajar con un gran número de elementos (use HashMap).

Hay varias variantes de la familia como: -SparseArray <Integer, Object> -SparseBooleanArray <Integer, Boolean> -SparseIntArray <Integer, Integer> -SparseLongArray <Integer, Long> Long Long >

Operaciones SparseArray

  • agregar elemento - put (int, x): agrega una asignación de la clave especificada al valor especificado, reemplazando la asignación anterior de la clave especificada si hubiera una. - añadir (int, x): coloca un par de clave / valor en la matriz, optimizando para el caso donde la clave es mayor que todas las claves existentes en la matriz. Debe usar append () en el caso de claves secuenciales para optimizar el rendimiento. De lo contrario, poner () está bien.

  • remove element - delete (int): elimina la asignación de la clave especificada, si la hubiera. - removeAt (int): elimina la asignación en el índice dado. - removeAtRange (int, int): elimina un rango de asignaciones como un lote.

  • access element - get (int): obtiene el int mapeado de la clave especificada, o 0 si no se ha realizado dicho mapeo. - get (int, E): obtiene el int mapeado de la clave especificada, o el valor especificado si no se ha realizado tal mapeo. - valueAt (int): dado un índice en el rango 0 ... tamaño () - 1, devuelve el valor de la asignación de clave-valor indexth que almacena este SparseIntArray. Los índices se ordenan en orden ascendente.

  • búsqueda de índice / clave - keyAt (int): dado un índice en el rango 0 ... tamaño () - 1, devuelve la clave de la asignación de valor-clave indexth que almacena este SparseIntArray. Los índices se ordenan en orden ascendente. - valueAt (int): dado un índice en el rango 0 ... tamaño () - 1, devuelve el valor de la asignación de clave-valor indexth que almacena este SparseIntArray. Los índices se ordenan en orden ascendente. - indexOfKey (int): devuelve el índice para el cual keyAt (int) devolvería la clave especificada, o un número negativo si la clave especificada no está asignada. - indexOfValue (E): devuelve un índice para el cual valueAt (int) devolvería la clave especificada, o un número negativo si no hay claves asignadas al valor especificado. Tenga en cuenta que esta es una búsqueda lineal, a diferencia de las búsquedas por clave, y que varias claves se pueden asignar al mismo valor y esto solo encontrará una de ellas. La diferencia en su huella de memoria es notable: el int usa 4 bytes, el entero usa 16 bytes. SparArray usa int como valor clave.

Ejemplo básico utilizando 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 en YouTube



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow