Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从scala LinkedHashMap中删除最早的条目_Scala_Scala Collections - Fatal编程技术网

从scala LinkedHashMap中删除最早的条目

从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, _]):

我试图使用scala的
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
,而无需最旧的条目。