簡體   English   中英

Scala集合特定實現

[英]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使用MapHashMap實現。 實現此目標的最佳方法是什么?

我考慮過的方法:

  1. 鑄件:

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

    這似乎有點可怕。

  2. 手動轉換:

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

    但這不是很實用。

  3. 使用構建器

     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.HashMapjava.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM