从scala LinkedHashMap中删除最早的条目
我试图使用scala的从scala LinkedHashMap中删除最早的条目,scala,scala-collections,Scala,Scala Collections,我试图使用scala的LinkedHashMap作为LRU缓存,但我不确定如何删除此类映射的最旧条目。我知道java的LinkedHashMap有一个方法RemoveedStantry,但是对于scala的实现似乎没有类似的方法。我不希望仅仅为了访问removeeldestentiry而转换为java实现。我如何才能做到这一点?这将满足您的要求: def removeOldestEntry[K](m: scala.collection.mutable.LinkedHashMap[K, _]):
LinkedHashMap
作为LRU缓存,但我不确定如何删除此类映射的最旧条目。我知道java的LinkedHashMap
有一个方法RemoveedStantry
,但是对于scala的实现似乎没有类似的方法。我不希望仅仅为了访问removeeldestentiry
而转换为java实现。我如何才能做到这一点?这将满足您的要求:
def removeOldestEntry[K](m: scala.collection.mutable.LinkedHashMap[K, _]): m.type =
m -= m.head._1
(感谢Jasper-M指出,
head
将给出最早的条目)您可以通过以下方式执行此操作:
object myApp {
def main(args: Array[String]) {
val myMap = new MyLinkedHashMap[Int,String]()
myMap.add(1, "a") // Map(1 -> a)
myMap.add(2, "b") // Map(1 -> a, 2 -> b)
myMap.add(3, "c") // Map(1 -> a, 2 -> b, 3 -> c)
myMap.add(4, "d") // Map(1 -> a, 2 -> b, 3 -> c, 4 -> d)
myMap.removeEldest // Map(2 -> b, 3 -> c, 4 -> d)
myMap.get(2) // Map(3 -> c, 4 -> d, 2 -> b)
myMap.removeEldest // Map(4 -> d, 2 -> b)
}
}
class MyLinkedHashMap[K,V] {
import scala.collection.mutable.LinkedHashMap
var map = new LinkedHashMap[K, V]()
/* adds an element to the HaskMap */
def add(key: K, value: V) {
map.put(key, value)
}
/* removes the LRU element from the HaskMap */
def removeEldest {
if (!map.isEmpty) {
map = map.drop(1)
}
}
/* gets the value for the given key and moves it to the top of the HashMap */
def get(key: K): Option[V] = {
val value = map.remove(key)
if (value != None) {
map.put(key, value.get)
}
return value
}
}
要删除HashMap或LRU中最旧的条目吗?因为如果要删除LRU条目,那么每次访问元素时都必须重新排列HashMap
RemoveedeStantry
在您所暗示的意义上是不可访问的。LinkedHashMap
的子类可以覆盖并为老化条目提供方向。相反,您可以使用init
获取除最后一个元素之外的所有元素。最旧的元素或LRU都可以。头head
不是“最旧”的条目吗?因此tail
将为您提供一个LinkedHashMap
,而无需最旧的条目。