这是我使用scala的第一天。我试图创建一个字符串,每个数字以字符串表示。例如,数字4310227将返回“1121100100”,因为0出现一次,1出现一次,2出现两次等等......
def pow(n:Int) : String = {
val cubed = (n * n * n).toString
val digits = 0 to 9
val str = ""
for (a <- digits) {
println(a)
val b = cubed.count(_==a.toString)
println(b)
}
return cubed
}
它似乎不起作用。我想要一些scalay理由,并知道我是否应该以这种方式去做。谢谢!
答案 0 :(得分:3)
当您在调用String#count()
时迭代字符串时,您正在使用Char
,而不是Strings
。您不希望将这两者与==
进行比较,因为它们不是同一类型的对象。
解决此问题的一种方法是在执行比较之前致电Char#toString()
,例如,修改您的代码以阅读cubed.count(_.toString==a.toString)
。
答案 1 :(得分:3)
正如Rado和cheeken所说,你将Char
与String
进行比较,这将永远不会是平等的。替换cheekin将每个字符转换为字符串的答案是从字符创建范围,即'0' to '9'
:
val digits = '0' to '9'
...
val b = cubed.count(_ == a)
请注意,如果您想要Int
表示的Char
,则可以调用 char .asDigit
。
Aleksey,Ren和Randall的答案是你想要解决的问题,因为他们将纯粹的解决方案分离出来。但是,鉴于这是你使用Scala的第一天,根据你的背景,你可能需要更多的背景才能理解它们。
答案 2 :(得分:2)
相当简单:
scala> ("122333abc456xyz" filter (_.isDigit)).foldLeft(Map.empty[Char, Int]) ((histo, c) => histo + (c -> (histo.getOrElse(c, 0) + 1)))
res1: scala.collection.immutable.Map[Char,Int] = Map(4 -> 1, 5 -> 1, 6 -> 1, 1 -> 1, 2 -> 2, 3 -> 3)
答案 3 :(得分:2)
这可能不是最快的方法,因为使用了像String和Char这样的中间数据类型,但却是最简单的一种:
def countDigits(n: Int): Map[Int, Int] =
n.toString.groupBy(x => x) map { case (n, c) => (n.asDigit, c.size) }
示例:
scala> def countDigits(n: Int): Map[Int, Int] = n.toString.groupBy(x => x) map { case (n, c) => (n.asDigit, c.size) }
countDigits: (n: Int)Map[Int,Int]
scala> countDigits(12345135)
res0: Map[Int,Int] = Map(5 -> 2, 1 -> 2, 2 -> 1, 3 -> 2, 4 -> 1)
答案 4 :(得分:1)
myNumAsString是一个字符串,例如“15625”
myNumAsString.groupBy(x => x).map(x => (x._1, x._2.length))
Result = Map(2 -> 1, 5 -> 2, 1 -> 1, 6 -> 1)
即。包含数字及其相应计数的地图。
这是做你的清单,按值对值进行分组(因此,对于初始字符串“15625”,它会生成1 - > 1,2> - > 2,6 - &gt; 6的映射,和5 - > 55.)。第二位只是创建一个值的映射到它发生的次数。
答案 5 :(得分:0)
这些百位数的计数恰好适合十六进制数字。
scala> val is = for (_ <- (1 to 100).toList) yield r.nextInt(10)
is: List[Int] = List(8, 3, 9, 8, 0, 2, 0, 7, 8, 1, 6, 9, 9, 0, 3, 6, 8, 6, 3, 1, 8, 7, 0, 4, 4, 8, 4, 6, 9, 7, 4, 6, 6, 0, 3, 0, 4, 1, 5, 8, 9, 1, 2, 0, 8, 8, 2, 3, 8, 6, 4, 7, 1, 0, 2, 2, 6, 9, 3, 8, 6, 7, 9, 5, 0, 7, 6, 8, 7, 5, 8, 2, 2, 2, 4, 1, 2, 2, 6, 8, 1, 7, 0, 7, 6, 9, 5, 5, 5, 3, 5, 8, 2, 5, 1, 9, 5, 7, 2, 3)
scala> (new Array[Int](10) /: is) { case (a, i) => a(i) += 1 ; a } map ("%x" format _) mkString
warning: there were 1 feature warning(s); re-run with -feature for details
res7: String = a8c879caf9
scala> (new Array[Int](10) /: is) { case (a, i) => a(i) += 1 ; a } sum
warning: there were 1 feature warning(s); re-run with -feature for details
res8: Int = 100
我要指出没有人使用过char系列,但现在我看到了Kristian。
def pow(n:Int) : String = {
val cubed = (n * n * n).toString
val cnts = for (a <- '0' to '9') yield cubed.count(_ == a)
(cnts map (c => ('0' + c).toChar)).mkString
}