Scala试图计算数字中的数字实例

时间:2014-02-12 01:38:08

标签: scala for-loop

这是我使用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理由,并知道我是否应该以这种方式去做。谢谢!

6 个答案:

答案 0 :(得分:3)

当您在调用String#count()时迭代字符串时,您正在使用Char,而不是Strings。您不希望将这两者与==进行比较,因为它们不是同一类型的对象。

解决此问题的一种方法是在执行比较之前致电Char#toString(),例如,修改您的代码以阅读cubed.count(_.toString==a.toString)

答案 1 :(得分:3)

正如Rado和cheeken所说,你将CharString进行比较,这将永远不会是平等的。替换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
}