假设我在Scala 2.10.2中的Seq中有一些数据,例如:
scala> val data = Seq( 1, 2, 3, 4, 5 )
data: Seq[Int] = List(1, 2, 3, 4, 5)
现在,我执行一些操作并将其转换为Map
scala> val pairs = data.map( i => i -> i * 2 )
pairs: Seq[(Int, Int)] = List((1,2), (2,4), (3,6), (4,8), (5,10))
scala> val pairMap = pairs.toMap
pairMap: scala.collection.immutable.Map[Int,Int] = Map(5 -> 10, 1 -> 2, 2 -> 4, 3 -> 6, 4 -> 8)
现在说,出于性能原因,我希望pairMap
使用HashMap
的{{1}}实现。实现这一目标的最佳方法是什么?
我考虑过的方式:
铸造:
Map
这看起来有点可怕。
手动转换:
pairMap.asInstanceOf[scala.collection.immutable.HashMap[Int,Int]]
但这不是很实用。
使用构建器
var hm = scala.collection.immutable.HashMap[Int,Int]()
pairMap.foreach( p => hm += p )
这很有效,但它不是最易读的代码。
有没有更好的方式让我失踪?如果不是,哪一种是最好的方法?
答案 0 :(得分:4)
有趣的一点:它已经是一个不可变的HashMap。
scala> val data = Seq( 1, 2, 3, 4, 5 )
data: Seq[Int] = List(1, 2, 3, 4, 5)
scala> val pairs = data.map( i => i -> i * 2 )
pairs: Seq[(Int, Int)] = List((1,2), (2,4), (3,6), (4,8), (5,10))
scala> val pairMap = pairs.toMap
pairMap: scala.collection.immutable.Map[Int,Int] =
Map(5 -> 10, 1 -> 2, 2 -> 4, 3 -> 6, 4 -> 8)
scala> pairMap.getClass
res0: Class[_ <: scala.collection.immutable.Map[Int,Int]] =
class scala.collection.immutable.HashMap$HashTrieMap
注意:转换为hashmap根本不会改变底层事物。如果你想保证构建一个hashmap(或某种特定的类型),那么我建议你这样做:
scala> import scala.collection.immutable
import scala.collection.immutable
scala> val pairMap = immutable.HashMap(pairs: _*)
pairMap: scala.collection.immutable.HashMap[Int,Int] =
Map(5 -> 10, 1 -> 2, 2 -> 4, 3 -> 6, 4 -> 8)
如果您正在寻求性能改进,则应考虑使用mutable.HashMap
或java.util.HashMap
。大多数scala的集合都由本地java.util
集合执行。
答案 1 :(得分:0)
你可以结合使用
map
:将键和值映射到元组breakOut
:&#34;爆发&#34;来自map
的元组序列,并直接创建目标类型val s = Seq.range(1, 6)
val m: scala.collection.immutable.HashMap[Int, Int] =
s.map(n => (n, n * n))(scala.collection.breakOut)
在没有中间地图的情况下即时创建HashMap
。
通过使用breakOut
和显式结果类型,选择map
的相应构建器,并直接创建目标类型