1

初学者在这里。

对不起,但我没有找到答案,所以我在这里问这个问题。

我想知道如何使用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))

谢谢

4

3 回答 3

4

经典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)
于 2013-11-05T15:44:26.363 回答
3
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))
于 2013-11-05T15:26:37.807 回答
0

我非常喜欢 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)

这看起来是正确的还是我的假设有误?

于 2015-01-21T05:34:40.107 回答