Scala - 列表中的元组列表

时间:2013-11-05 15:11:59

标签: scala

初学者。

很抱歉,但我没有找到答案,所以我在这里提出问题。

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

由于

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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))

答案 2 :(得分: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)

这看起来是否正确,或者我的假设是否错误?