2011-08-30 9 views
7

LinkedHashMapをどのように縮小できますか?私はremoveEldestEntryメソッドをオーバーライドしましたが、このメソッドは新しい値が挿入されたときに一度しか呼び出されません。このように地図を小さくする変更はありません。JavaでLinkedHashMapを小さくする

LinkedHashMapは私の通常のIteratorを与え、任意のremoveLastまたはlistIteratorメソッドを持っていないので、どのようにあなたが最後に、1000年と言う、エントリを検索し、それらを削除することができますか?

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

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

removeEldestEntryメソッドでmaxSizeが縮小された場合は、最初にIteratorの最初の値を削除してから、再度挿入してください。そして、再挿入は最も古い値を追い出すでしょう。これは非常に醜いコードです...どんな良いアイデア?

EDIT:最も古いものから最も若いものを選択してください。それで簡単です

答えて

5

イテレータは、LinekdHashMapで最も古いものから最も若いものまで繰り返します。 LinkedHashMapを以下のサイズに縮小したい場合は、

Map<K,V> lhm = 
int desiredSize = 
for(Iterator iter = lhm.keySet().iterator();iter.hasNext()) { 
    if(lhm.size() <= desiredSize) break; 
    iter.remove(); 
} 

これは、1エントリにつき約20 ns必要です。

関連する問題