Scala集合特定实现

时间:2014-10-21 08:26:32

标签: scala collections

假设我在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}}实现。实现这一目标的最佳方法是什么?

我考虑过的方式:

  1. 铸造:

    Map

    这看起来有点可怕。

  2. 手动转换:

    pairMap.asInstanceOf[scala.collection.immutable.HashMap[Int,Int]]
    

    但这不是很实用。

  3. 使用构建器

    var hm = scala.collection.immutable.HashMap[Int,Int]()
    pairMap.foreach( p => hm += p )
    

    这很有效,但它不是最易读的代码。

  4. 有没有更好的方式让我失踪?如果不是,哪一种是最好的方法?

2 个答案:

答案 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.HashMapjava.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的相应构建器,并直接创建目标类型