Поиск…


Вступление

SparseArray - альтернатива для Map . Map требует, чтобы ее ключи были объектами. Явление автобоксинга происходит, когда мы хотим использовать в качестве ключа примитивное значение int . Компилятор автоматически преобразует примитивные значения в свои бокс-типы (например, int в Integer ). Разница в области памяти заметна: int использует 4 байта, Integer использует 16 байт. SparseArray использует int как ключевое значение.

замечания

Преимущество:

  • Меньше использования памяти (из-за примитивных ключей).
  • Нет автоматического бокса.

Недостаток :

  • SparseArray использует двоичный поиск для значения find (O (log n)), поэтому его может быть не лучшим решением, если нужно работать с большим количеством элементов (используйте HashMap).

Существует несколько вариантов семейства, таких как: -SparseArray <Integer, Object> -SparseBooleanArray <Integer, Boolean> -SparseIntArray <Integer, Integer> -SparseLongArray <Integer, Long> -LongSparseArray <Long, Object> -LongSparseLongArray <Long, Long >

Операции SparseArray

  • добавление элемента - put (int, x): добавляет сопоставление от указанного ключа к указанному значению, заменяя предыдущее сопоставление с указанным ключом, если оно есть. - append (int, x): помещает пару ключ / значение в массив, оптимизируя для случая, когда ключ больше всех существующих ключей в массиве. Вы должны использовать append () в случае последовательных ключей для оптимизации производительности. В противном случае put () в порядке.

  • remove element - delete (int): Удаляет отображение из указанного ключа, если он есть. - removeAt (int): Удаляет отображение по данному индексу. - removeAtRange (int, int): удалить диапазон отображений в виде пакета.

  • accessing element - get (int): Получает int, отображаемый из указанного ключа, или 0, если такое отображение не было сделано. - get (int, E): Получает int, отображаемый из указанного ключа, или указанное значение, если такое отображение не было сделано. - valueAt (int): Учитывая индекс в диапазоне 0 ... size () - 1, возвращает значение из сопоставления значений ключа indexth, которое хранится в этом SparseIntArray. Индексы упорядочены в порядке возрастания.

  • index / key search - keyAt (int): Учитывая индекс в диапазоне 0 ... size () - 1, возвращает ключ из сопоставления значений ключа indexth, который хранится в этом SparseIntArray. Индексы упорядочены в порядке возрастания. - valueAt (int): Учитывая индекс в диапазоне 0 ... size () - 1, возвращает значение из сопоставления значений ключа indexth, которое хранится в этом SparseIntArray. Индексы упорядочены в порядке возрастания. - indexOfKey (int): возвращает индекс, для которого keyAt (int) вернет указанный ключ или отрицательное число, если указанный ключ не отображается. - indexOfValue (E): возвращает индекс, для которого valueAt (int) вернет указанный ключ или отрицательное число, если никакие клавиши не сопоставляются с указанным значением. Остерегайтесь, что это линейный поиск, в отличие от поиска по ключу, и что несколько ключей могут сопоставляться с одним и тем же значением, и это найдет только один из них. Разница в области памяти заметна: int использует 4 байта, Integer использует 16 байт. SparseArray использует int как значение ключа.

Основной пример использования 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);

Учебник на YouTube



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow