如何获取地图的子集?
假设我们有
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,contains和get方法.访问元素时会产生开销.这意味着新映射不使用额外的内存,但也无法释放旧映射的内存.
如果你需要释放内存并尽可能快地访问,那么快速的方法是将元素折叠k成新的Map而不生成中间体List[(Int,String)]:
k.foldLeft(Map[Int,String]()){ (acc, x) => acc + (x -> m(x)) }
Run Code Online (Sandbox Code Playgroud)