scala의 LinkedHashMap
을 LRU 캐시로 사용하려고하지만이 맵의 가장 오래된 항목을 제거하는 방법을 모르겠습니다. java의 LinkedHashMap
에는 removeEldestEntry
이라는 메쏘드가 있지만, scala의 구현과 비슷한 메쏘드가없는 것 같습니다. removeEldestEntry
에 액세스하기 위해 Java 구현으로 변환하지 않는 것을 선호합니다. 이것을 어떻게 할 수 있습니까?스칼라에서 가장 오래된 항목 제거 LinkedHashMap
4
A
답변
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
}
}
HashMap 또는 LRU에서 가장 오래된 항목을 제거 하시겠습니까? LRU 항목을 제거하려면 요소에 액세스 할 때마다 HashMap을 다시 배열해야하므로 –
'removeEldestEntry'는 사용자가 암시하는 의미에서 액세스 할 수 없기 때문입니다. LinkedHashMap의 서브 클래스가 오버라이드 (override) 해 엔트리의 에이징의 방향을 제공 할 수 있습니다. 대신'init'을 사용하여 마지막 요소를 제외한 모든 요소를 가져올 수 있습니다. –
가장 오래되었거나 LRU가 좋습니다. – jonderry