从scala LinkedHashMap中删除最旧的条目

时间:2014-06-18 19:18:11

标签: scala scala-collections

我正在尝试使用scala的LinkedHashMap作为LRU缓存,但我不确定如何删除此类地图的最旧条目。我知道java的LinkedHashMap有一个方法removeEldestEntry,但scala的实现似乎没有类似的方法。我不想转换为java的实现只是为了访问removeEldestEntry。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:2)

这将做你想要的:

def removeOldestEntry[K](m: scala.collection.mutable.LinkedHashMap[K, _]): m.type =
  m -= m.head._1

(向Jasper-M致敬,指出head将提供最早的条目)

答案 1 :(得分:2)

您可以通过以下方式执行此操作:

    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
      }
    }