簡體   English   中英

Scala-列表到元組列表

[英]Scala - List to List of tuples

初學者在這里。

抱歉,我沒有找到答案,所以我在這里問問題。

我想知道如何通過使用Scala API來做到這一點:

(blabla))( -> List(('(',2),(')',2))

目前我有這個:

"(blabla))(".toCharArray.toList.filter(p => (p == '(' || p == ')')).sortBy(x => x)

輸出:

List((, (, ), ))

現在如何將每個字符映射到我描述的元組?

一般情況的示例:

"t:e:s:t" -> List(('t',2),('e',1),('s',1),(':',3))

謝謝

經典groupBy . mapValues groupBy . mapValues用例:

scala> val str = "ok:ok:k::"
str: String = ok:ok:k::

scala> str.groupBy(identity).mapValues(_.size) // identity <=> (x => x)
res0: scala.collection.immutable.Map[Char,Int] = Map(k -> 3, : -> 4, o -> 2)
val source = "ok:ok:k::"
val chars = source.toList
val shorter = chars.distinct.map( c => (c, chars.count(_ == c)))    
//> shorter  : List[(Char, Int)] = List((o,2), (k,3), (:,4))

我非常喜歡sschaef的解決方案,但我想知道是否有人可以權衡該解決方案與該解決方案相比的效率:

scala> val str = "ok:ok:k::"
str: String = ok:ok:k::

scala> str.foldLeft(Map[Char,Int]().withDefaultValue(0))((current, c) => current.updated(c, current(c) + 1)) 
res29: scala.collection.immutable.Map[Char,Int] = Map(o -> 2, k -> 3, : -> 4)

我認為我的解決方案比較慢。 如果我們有n個總出現次數和m個唯一值:

我的解決方案:在所有出現的次數或n上,我們都有棄權。 對於這些情況中的每一個,我們都會查找一次以查找當前計數,然后再次創建更新的地圖。 我假設更新地圖的創建是恆定時間。
總復雜度:n * 2m或O(n * m)

sschaef的解決方案:我們假設有groupBy,它只是在不檢查映射的情況下將條目添加到列表中(因此,對於所有值,這將是一個恆定的時間查找並附加到列表中),所以n。 然后對於mapValues,它可能會遍歷唯一值並獲取每個鍵列表的大小。 我假設獲取每個條目列表的大小是固定時間。
總復雜度:O(n + m)

這看起來是正確的還是我的假設是錯誤的?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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