#scala #scala-collections
#scala #scala-коллекции
Вопрос:
Я пытаюсь использовать scala LinkedHashMap
в качестве кэша LRU, но я не уверен, как удалить самую старую запись такой карты. Я знаю, что у java LinkedHashMap
есть метод removeEldestEntry
, но, похоже, аналогичного метода для реализации scala не существует. Я бы предпочел не конвертировать в реализацию Java, просто чтобы иметь доступ removeEldestEntry
. Как я могу этого добиться?
Комментарии:
1. вы хотите удалить самую старую запись в HashMap или LRU? потому что, если вы хотите удалить запись LRU, вам придется переставлять HashMap каждый раз, когда вы обращаетесь к элементу
2.
removeEldestEntry
недоступен в том смысле, который вы подразумеваете. Для подклассов доступноLinkedHashMap
переопределение и предоставление направления для устаревания записей. Вместо этого вы можете использоватьinit
для получения каждого элемента, кроме последнего.3. Подойдет либо самая старая, либо LRU.
4. Разве это не
head
«самая старая» запись? Этоtail
даст вамLinkedHashMap
без самой старой записи.
Ответ №1:
Это будет делать то, что вы хотите:
def removeOldestEntry[K](m: scala.collection.mutable.LinkedHashMap[K, _]): m.type =
m -= m.head._1
(Спасибо Jasper-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
}
}
Комментарии:
1. Немного поздно, но … новее когда-либо использовать оба:
var
иcollection.mutable.*
. Выберите один… не оба.