如何在不遍历整个地图或收集中间集合中的密钥的情况下从LinkedHashMap
中删除最旧的条目? LinkedHashMap
条目按插入顺序排序,因此在迭代时首先找到最旧的条目。我想这样做:
userAndWhenMap.iterator.removeWhile { case (userId, userAndWhen) =>
now.millisSince(userAndWhen.when) > DeleteAfterInactiveMillis
}
但removeWhile
不存在。有一个dropWhile
,但它没有改变地图 - 它推进了一个迭代器。有没有办法实现像removeWhile
?
(我知道retain
但是它遍历整个地图。我知道我可以找到我想删除的密钥并将它们插入一个集合中,然后遍历它并Map.remove(..)
。)
答案 0 :(得分:2)
我认为唯一的方法是将removeWhile方法实现为LinkedHashMap
类的扩展方法
只有两种方法可以修改此集合而不是返回新集合:retain
和transform
(我忽略++ =,+ =, - =和 - =此处)并且它们不要做你需要的。
这是示例代码:
implicit class LinkedHashMapOps[A, B](val self: LinkedHashMap[A, B]) extends AnyVal {
def removeWhile(predicate: ((A, B)) => Boolean): self.type = {
val toRemove = self.iterator.takeWhile(predicate).map(_._1)
toRemove foreach (self -= _)
self
}
}
并测试:
@ val map = new LinkedHashMap[Int, String]
@ map += (1 -> "a")
@ map += (2 -> "a")
@ map += (3 -> "a")
@ map += (4 -> "a")
res6: LinkedHashMap[Int, String] = Map(1 -> "a", 2 -> "a", 3 -> "a", 4 -> "a")
@ map.removeWhile(_._1 < 3)
res8: LinkedHashMap[Int, String] = Map(3 -> "a", 4 -> "a")