我可以从LinkedHashMap中删除它吗?

时间:2016-01-10 11:14:11

标签: scala

如何在不遍历整个地图或收集中间集合中的密钥的情况下从LinkedHashMap中删除最旧的条目? LinkedHashMap条目按插入顺序排序,因此在迭代时首先找到最旧的条目。我想这样做:

  userAndWhenMap.iterator.removeWhile { case (userId, userAndWhen) =>
    now.millisSince(userAndWhen.when) > DeleteAfterInactiveMillis
  }

removeWhile不存在。有一个dropWhile,但它没有改变地图 - 它推进了一个迭代器。有没有办法实现像removeWhile

这样的东西

(我知道retain但是它遍历整个地图。我知道我可以找到我想删除的密钥并将它们插入一个集合中,然后遍历它并Map.remove(..)。)

1 个答案:

答案 0 :(得分:2)

我认为唯一的方法是将removeWhile方法实现为LinkedHashMap类的扩展方法

只有两种方法可以修改此集合而不是返回新集合:retaintransform(我忽略++ =,+ =, - =和 - =此处)并且它们不要做你需要的。

这是示例代码:

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")