如何获取地图的子集?

Joh*_*ood 3 scala map

如何获取地图的子集?

假设我们有

val m: Map[Int, String] = ...
val k: List[Int]
Run Code Online (Sandbox Code Playgroud)

所有键k存在的地方m.

现在我想得到一个Map的子部分m,只有对哪个键在列表中k.

有点像m.intersect(k),但intersect没有在地图上定义.

一种方法是使用filterKeys:m.filterKeys(k.contains).但这可能有点慢,因为对于原始地图中的每个键,必须在列表中进行搜索.

我能想到的另一种方式是k.map(l => (l, m(l)).toMap.这里只是迭代我们真正感兴趣的键,不进行搜索.

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

Lui*_*hys 14

m filterKeys k.toSet
Run Code Online (Sandbox Code Playgroud)

因为a Set是a Function.

性能: filterKeys本身是O(1),因为它的工作原理是生产具有重写的新地图foreach,iterator,containsget方法.访问元素时会产生开销.这意味着新映射不使用额外的内存,但也无法释放旧映射的内存.

如果你需要释放内存并尽可能快地访问,那么快速的方法是将元素折叠k成新的Map而不生成中间体List[(Int,String)]:

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