[英]Scala Collection Specific Implementation
假設我在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
使用Map
的HashMap
實現。 實現此目標的最佳方法是什么?
我考慮過的方法:
鑄件:
pairMap.asInstanceOf[scala.collection.immutable.HashMap[Int,Int]]
這似乎有點可怕。
手動轉換:
var hm = scala.collection.immutable.HashMap[Int,Int]() pairMap.foreach( p => hm += p )
但這不是很實用。
使用構建器
scala.collection.immutable.HashMap[Int,Int]( pairMap.toSeq:_* )
這行得通,但這不是最易讀的代碼。
有沒有更好的方法我想念嗎? 如果不是,哪種方法最好?
有趣的一點:它已經是一個不變的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
注意:強制轉換為哈希圖根本不會改變基礎內容。 如果您想保證構建一個哈希圖(或某些特定類型),那么我建議您這樣做:
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
集合。
你可以結合
map
:將鍵和值map
到元組 breakOut
:從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
構建器,然后直接創建目標類型
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.