수색…


소개

SparseArray A에 대한 대안입니다 Map . Map 은 키가 객체가되어야합니다. autoboxing 현상은 원시 int 값을 키로 사용하고자 할 때 발생합니다. 컴파일러는 원시 값을 박스형 (예 : int 에서 Integer )으로 자동 변환합니다. 메모리 사용 공간의 차이는 눈에 띄게 나타납니다. int 는 4 바이트를 사용하고, Integer 는 16 바이트를 사용합니다. SparseArrayint 를 키 값으로 사용합니다.

비고

장점 :

  • 적은 메모리 사용량 (기본 키 때문에).
  • 자동 권투가 없습니다.

단점 :

  • SparseArray는 값 (O (log n))을 찾는 데 이진 검색을 사용하므로 많은 수의 요소 (HashMap 사용)를 사용해야하는 경우 최적의 솔루션이 아닐 수도 있습니다.

-SparseArray <Integer, Long> -LongSparseArray <Long, Object> -LongSparseLongArray <Long, Long) -SparseArray <Integer, Object> -SparseBooleanArray <Integer, Boolean> -SparseIntArray <정수, 정수> -SparseLongArray <정수, Long> >

SparseArray 작업

  • 요소의 추가 - put (int, x) : 지정된 키로부터 지정된 값에의 매핑을 추가합니다. - append (int, x) : 키 / 값 쌍을 배열에 넣고 키가 배열의 기존 키보다 큰 경우 최적화합니다. 성능을 최적화하려면 순차 키의 경우 append ()를 사용해야합니다. 그렇지 않으면 put ()이 좋습니다.

  • 요소 삭제 - delete (int) : 지정된 키에서 매핑을 제거합니다 (있는 경우). removeAt (int) : 지정된 인덱스의 매핑을 삭제합니다. removeAtRange (int, int) : 배치의 범위를 삭제합니다.

  • 요소를 액세스 할 때 - get (int) : 지정된 키에서 매핑 된 int를 가져 오거나 이러한 매핑이없는 경우 0을 가져옵니다. get (int, E) : 지정된 키로부터 맵 된 int를 가져옵니다. 그러한 매핑이없는 경우는 지정된 값을 가져옵니다. valueAt (int) : 0 ... size () - 1 범위의 인덱스가 지정된 경우이 SparseIntArray가 저장하는 인덱스 키 - 값 매핑의 값을 반환합니다. 색인은 오름차순으로 정렬됩니다.

  • index / key search - keyAt (int) : 0 ... size () - 1 범위의 인덱스가 지정된 경우이 SparseIntArray가 저장하는 인덱스 키 - 값 매핑의 키를 반환합니다. 색인은 오름차순으로 정렬됩니다. valueAt (int) : 0 ... size () - 1 범위의 인덱스가 지정된 경우이 SparseIntArray가 저장하는 인덱스 키 - 값 매핑의 값을 반환합니다. 색인은 오름차순으로 정렬됩니다. indexOfKey (int) : keyAt (int)가 지정된 키를 반환 할 색인을 반환하거나 지정된 키가 매핑되지 않은 경우 음수를 반환합니다. - indexOfValue (E) : valueAt (int)가 지정된 키를 반환하는 인덱스를 반환하거나 키가 지정된 값에 매핑되지 않은 경우 음수를 반환합니다. 이것은 키에 의한 룩업과는 달리 선형 검색이며 여러 키가 동일한 값으로 매핑 될 수 있으며이 중 하나만 찾을 수 있음을 유의하십시오. 메모리 풋 프린트의 차이는 눈에 띄게 나타납니다. int는 4 바이트를 사용하고 Integer는 16 바이트를 사용합니다. ParseArray는 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