2014-06-18 2 views
4

scala의 LinkedHashMap을 LRU 캐시로 사용하려고하지만이 맵의 가장 오래된 항목을 제거하는 방법을 모르겠습니다. java의 LinkedHashMap에는 removeEldestEntry이라는 메쏘드가 있지만, scala의 구현과 비슷한 메쏘드가없는 것 같습니다. removeEldestEntry에 액세스하기 위해 Java 구현으로 변환하지 않는 것을 선호합니다. 이것을 어떻게 할 수 있습니까?스칼라에서 가장 오래된 항목 제거 LinkedHashMap

+0

HashMap 또는 LRU에서 가장 오래된 항목을 제거 하시겠습니까? LRU 항목을 제거하려면 요소에 액세스 할 때마다 HashMap을 다시 배열해야하므로 –

+1

'removeEldestEntry'는 사용자가 암시하는 의미에서 액세스 할 수 없기 때문입니다. LinkedHashMap의 서브 클래스가 오버라이드 (override) 해 엔트리의 에이징의 방향을 제공 할 수 있습니다. 대신'init'을 사용하여 마지막 요소를 제외한 모든 요소를 ​​가져올 수 있습니다. –

+0

가장 오래되었거나 LRU가 좋습니다. – jonderry

답변

2

이것은 당신이 원하는 것을 할 것입니다 :

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

(재스퍼-M에 대한 명예를 head 가장 오래된 항목을 줄 것이라고 지적에 대해)

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