计算字符串的外观并输出带有字符的列表-外观

时间:2018-10-24 13:37:52

标签: scala functional-programming

我正在Scala上制作密码战kata。我仍然是该语言的入门者,并且我正在尝试以功能性编程的方式来做事情,这对我来说也是一种误解。

该任务的想法很简单,它们为您提供了一个字符串,您需要输出一个包含字符和在列表中的次数的列表。应该很容易:

Kata.orderedCount(“ abracadabra”)== List(('a',5),('b',2),('r',2),('c',1),('d ',1)

这是我正在编写的代码。我也不明白为什么我无法打印出循环list_final,即使我将它作为返回值也可以使用(这里的解释也可以)。它应该只是找到一种将新列表追加到现有列表中的方法,但是scala中的列表是不可改变的:(。预先感谢

var cuerda = "abracadabra" 
var cuerda2 = cuerda.groupBy(word => word)
var cont:Int = 0
var list288 = List[Any]()
var vector = new Array[Any](cuerda.distinct.size)
cuerda.map(cuerda2).distinct.foreach(e=> {
  println(List(e(0).toString, e.size))
  var list_final = list288 ::: List(e(0).toString, e.size)
  cont+=1
  vector = vector +: Array(e(0), e.size)
  println(list_final)

})
println(list288)

1 个答案:

答案 0 :(得分:1)

在Scala中更容易一些:

val cuerda = "abracadabra"
cuerda.groupBy(identity).map { case (k, v) => k -> v.length }.toList

也许有一种更简单的方法。

编辑: 还有,谢谢蒂姆:

cuerda.groupBy(identity).mapValues(_.length).toList

更新: 由于您要保持秩序,因此可以执行以下操作:

val counts = cuerda.groupBy(identity).mapValues(_.length)
cuerda.distinct.map(c => c -> counts(c)).toList

再次,也许有更好的方法。