Удалить самую старую запись из scala LinkedHashMap

#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.* . Выберите один… не оба.