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

Scala试图计算数字中某个数字的实例,scala,for-loop,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.coun

这是我第一天使用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的原因,以及我是否应该这样做。谢谢

当您在字符串上迭代时(这是您在调用Stringcount时所做的),您使用的是字符,而不是字符串。您不想将这两个对象与==进行比较,因为它们不是相同类型的对象

解决此问题的一种方法是在执行比较之前调用ChartoString,例如,修改代码以读取cubed.count\uu.toString==a.toString。

相当简单:

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)

其中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->6和5->55的映射。。第二位只是创建一个值到发生次数计数的映射。

这可能不是最快的方法,因为使用了字符串和字符等中间数据类型,而是最简单的方法之一:

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)

正如Rado和cheeken所说,您正在将字符与字符串进行比较,而字符串永远不会相等。cheekin将每个字符转换为字符串的答案的另一种选择是创建一个从字符“0”到“9”的范围:

请注意,如果需要Char表示的Int,可以调用Char.asDigit


Aleksey、Ren和Randall的答案是你想要努力实现的,因为他们分离出了问题的纯解决方案。然而,考虑到这是您使用Scala的第一天,根据您的背景,您可能需要更多的上下文才能理解它们。

这一百个数字的计数恰好适合十六进制数字

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
我想指出,没有人使用字符范围,但现在我看到克里斯蒂安使用了

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
}

如果我能回到使用Scala的第一天,我会心跳加速,心跳加速。为什么?好吧,完全公开,每天都感觉像是我第一天使用Scala。总有新的东西要学;或者,我总是在FIFO的基础上忘记它。我希望文件管理器是安全的,但在他的例子中,他有Int作为输入,所以过滤器不需要yes来折叠,yes来后悔相当简单。直到看到编辑,我才得到评论;有时候我喜欢这样的氛围。
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
}