2017-03-11 3 views
1

私のAndroidプロジェクトでは、キャッシュを部分的に無効にする方法があります (HashMap<Integer, Boolean>)。キー値が定義された値より大きいHashMap内のすべての項目を削除する方法

現在、サードパーティのコードとの互換性のためにHashMapを使用しています。

私は素晴らしい答えを見つけましたhereしかし、それはTreeMapに切り替える必要があります。与えられた解決策は次のとおりです。

treeMap.tailMap(key).clear(); 

TreeMapのソリューションは、HashMapの上で私の努力よりもはるかに優れています:

//where hashMap is a copied instance for the method 
for (Integer key : hashMap.keySet()) { 
    if (key > minPosition) { 
     hashMap.remove(key); 
    } 
} 

はTreeMapのと類似のHashMapでこれを行うための良い時間/複雑ソリューションは、あります溶液?

+0

独自の実装で提供できるものは、TreeMapソリューションよりはるかに優れています(ただし、キーの値ではなく、挿入順に基づいて並べ替えられます)。削除するメンバの開始位置を特定するためにバイナリ検索を実装するだけで、開始ノードを次のノードに設定することができます。これは、わかっていればツリーマップでバックグラウンドで実行されます。それはもっと安全な賭けだから、私はちょうどそれで行くだろう。 –

+0

こんにちは、私はそれがTreeMapソリューションよりも良いとは思いません。 *私の*解決策よりも優れたものが欲しい。 TreeMapの効率に近いもの。これまでのところ、TreeMapは私にとっても良いようですが、HashMapでうまくやることができたら、私はコミットしたくありません(この愚かなサードパーティのものはすべてHashMapに変換してくれませんMapインターフェイスに固執するだけです。 –

+0

'hashMap.keySet()'を反復処理することができますので、完全な 'Entry'をロードしないでください。 –

答えて

3

HashMapを使用する必要がある場合は、エントリセットを反復してエントリを1つずつ削除するよりも優れた(効率的な)ソリューションはありません。これはO(N)操作になります。あなたは地図のすべてのエントリを訪問/テストする必要があります。

正しく表示されているように、TreeMapからエントリをよりきれいに、より効率的に一括削除できます。 O(logN)の操作になります。しかし、欠点は、挿入と削除がO(1)ではなくO(logN)であることです。

LinkedHashMapは、特定のユースケースで役に立ちますが、このケースでは役に立ちません。

関連する問題