如何获取地图的子集?
假设我们有
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)
归档时间: |
|
查看次数: |
3056 次 |
最近记录: |