8

どのように縮小できますLinkedHashMapか?メソッドをオーバーライドしましたremoveEldestEntryが、このメソッドは新しい値が挿入されたときに 1 回だけ呼び出されます。したがって、この方法でマップを小さくすることに変更はありません。

LinkedHashMapのみが法線を提供し、またはメソッドIteratorはありません。では、最後の、たとえば 1000 のエントリを見つけて削除するにはどうすればよいでしょうか。removeLastlistIterator

私が考えることができる唯一の方法は、そのすべてを繰り返すことです。しかし、それには何年もかかることがあります...

いくつかの要素だけを削除したいたびに新しいマップを作成すると、メモリも破壊されます。

メソッドで が削減されたときに、 の最初の値を削除してIteratorから再挿入した可能性があります。次に、再挿入すると、最も古い値が追い出されます。これは非常に醜いコードです...もっと良いアイデアはありますか?maxSizeremoveEldestEntry

編集: Sry 反復順序は古いものから新しいものへです。だから簡単です

4

2 に答える 2

6

イテレータは、LinekdHashMap に対して最も古いものから最も新しいものへと反復します。LinkedHashMap をサイズに縮小したい場合は、以下を使用できます。

Map<K,V> lhm =
int desiredSize = 
for(Iterator iter = lhm.keySet().iterator();iter.hasNext()) {
   if(lhm.size() <= desiredSize) break;
   iter.next();     //required else IllegalStateException since current=null 
   iter.remove();
}

これには、削除されるエントリごとに約 20 ns かかります。

于 2011-08-30T22:01:50.553 に答える