web-dev-qa-db-ja.com

SparseArray、キーが存在するかどうかを確認します

_HashMap<Integer, Bitmap>_を使用してビットマップキャッシュを実装していて、Eclipseで次の警告を受け取りました。

パフォーマンスを向上させるには、代わりに新しいSparseArray(...)を使用してください。

以前にそのクラスについて聞いたことがありませんが、それを検査すると、キャッシュからビットマップを取得してキャッシュに存在するかどうかを確認するときに呼び出すcontainsKey()メソッドがないようです。そうでない場合は、追加します。

キーがすでに存在するかどうかを確認する最良の方法についてのアイデアはありますか?

このオーバーロードを使用してnullをチェックするようにコードを変更できると思いますか?

_Bitmap bitmap = cache.get(key, null); 
_
41
magritte

あなたは使うことができます:

_Bitmap bitmap = cache.get(key, null); 
_

ただし、これは get(key) と同じであることを理解してください。

_Bitmap bitmap = cache.get(key); 
_

get(key, default)を使用する最良の方法は、一般的なデフォルトのケースを提供することです。キーが見つからない場合、有効な置換を使用します。

ただし、if(get(key) != null)の代わりにcontains()を使用しない理由はありません。

47
Sam

したがって、さまざまな状況で値がnullになる可能性があるので、useindexOfKey(int key)を使用することをお勧めします indexOfKey(int key) 参照。

次に、単に負の戻り値を確認します

if(mySparseArray.indexOfKey(int) < 0) {
   //Item does not exist. Do something relevant 
}
31
Alex

SparseArrayのget()メンバーがバイナリを使用しているため、SparseArrayの実装では、HashMapよりもパフォーマンス(時間の複雑さ)が優れている(モバイル環境で意味のある低いスペース要件を除く)と直観に反するようです(O(log N))を検索し、HashMapではarray-indexing(O(1))を使用します。

両方のクラスにget()メソッド実装を提供する(現状のまま):

public V get(Object key) { // for HashMap
    if (key == null)
        return getForNullKey();
    int hash = hash(key.hashCode());
    for (Entry<K,V> e = table[indexFor(hash, table.length)];
            e != null;
            e = e.next) {
        Object k;
        if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
            return e.value;
    }
    return null;
}

public E get(int key, E valueIfKeyNotFound) {  //for SparseArray
    int i = binarySearch(mKeys, 0, mSize, key);

    if (i < 0 || mValues[i] == DELETED) {
        return valueIfKeyNotFound;
    } else {
        return (E) mValues[i];
    }
}

sparseArray内のキーの存在を確認するためにindexOfKey(key)<0またはget(key)== nullのどちらを使用するかについては、どちらも下でバイナリ検索を使用するため、何でも問題ありません。

public int indexOfKey(int key) {  // for SparseArray
    if (mGarbage) {
        gc();
    }

    return binarySearch(mKeys, 0, mSize, key);
}
1
neel

ドキュメント からの引用。

SparseArraysは整数をオブジェクトにマップします。オブジェクトの通常の配列とは異なり、インデックスにギャップがある場合があります。 HashMapを使用して整数をオブジェクトにマップするよりも効率的です。

get(int) を使用できます。これは、キーが見つからない場合にもnullを返します。お気に入り;

ビットマップビットマップ= cache.get(key);

1
auselen

複数の方法:

  1. とにかくキーに関連付けられている値を使用する場合は、get()を使用できます。

    _val sparseArray = SparseArray<String>()
    val someKey = 123
    val someValue: String? = sparseArray[someKey]
    if(someValue!=null){
        //do something
    }
    _

IDEが考えることとは対照的に、nullにすることができるため、_?_を追加したのはこのためです。

  1. 存在するかどうかだけを確認したい場合は、indexOfKey(key) >= 0を使用できます。

  2. 上記が気に入らず、より読みやすいオプションが必要な場合は、ktx-collection依存関係のcontainsKeyを使用できます。

    _implementation 'androidx.core:core-ktx:#'
    implementation 'androidx.collection:collection-ktx:#'
    _

使用法:

_    val sparseArray = SparseArray<String>()
    val someKey = 123
    if (sparseArray.containsKey(someKey)) {
        //do something
    }
_
0