如何获取地图的一个子集?(How to get a subset of a map?)

2019-09-21 17:57发布

如何获取地图的一个子集?

假设我们有

val m: Map[Int, String] = ...
val k: List[Int]

凡在所有按键k中存在的m

现在,我想获得的地图一分节m只用对的,其关键是在列表k

m.intersect(k)intersect未在地图上定义的。

一种方法是使用filterKeysm.filterKeys(k.contains) 但是,这可能会有点慢,因为在原始地图列表中搜索必须做每个键。

我能想到的另一种方式是k.map(l => (l, m(l)).toMap 。这里魏某只是通过我们真正感兴趣的,不要使搜索键重复。

有没有更好的(内置)的方式?

Answer 1:

m filterKeys k.toSet

因为一Set是一个Function

性能filterKeys本身是O(1),因为它的工作原理与重写产生新地图foreachiteratorcontainsget方法。 开销来当元素进行访问。 这意味着,新的地图不使用额外的内存,也为老地图内存不能被释放。

如果你需要释放内存,并拥有最快的速度访问,快速的方法是将折叠的元素k到一个新的地图,而产生出一个中间List[(Int,String)]

k.foldLeft(Map[Int,String]()){ (acc, x) => acc + (x -> m(x)) }


Answer 2:

val s = Map(k.map(x => (x, m(x))): _*)



Answer 3:

我觉得这是最可读的和良好的表演:

k zip (k map m) toMap

或者,方法调用的风格是:

k.zip(k.map(m)).toMap



文章来源: How to get a subset of a map?
标签: scala map