【问题标题】:How to split a number into its digits in scala如何在scala中将数字拆分为数字
【发布时间】:2021-08-07 18:05:12
【问题描述】:

以下 sn-p 可以很好地将数字拆分为数字,但它太长了:

val digits = (num toString).toList map(_.toString) map(_.toInt)

我将它们映射到toString 以获取应用toInt 时的实际值,而不是代表ChartoList 返回的Int 值。

我是 Scala 的新手,我不习惯 scala 的表达风格。 有没有更短的方法来做到这一点。

【问题讨论】:

  • 你应该使用 Luigi 提到的asDigit,但是,你知道,你可以将你的版本写成num.toString.map(_.toString.toInt)

标签: scala split numbers


【解决方案1】:
scala> 123.toString.map(_.asDigit)
res0: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3)

【讨论】:

  • 对于负数,这给出了 "-123" => Seq(-1, 1, 2, 3) 的稍微奇怪的结果。
【解决方案2】:
(""+123).map(_-48)

我认为是最短的,但有时清晰更重要。 ('0' 至少多了一个字符而不是48!)

【讨论】:

  • 短:(""+123)map(_-48)
  • 无论如何,我不认为 OP 想要最短的 :)
【解决方案3】:

即使你不换成String也可以:

def getDigits(n: Int): List[Int] = {
  def getDigits(n:Int, digits:List[Int]):List[Int]={
    if(n< 10) n::digits else getDigits(n/10, ( n % 10)::digits )
   }
  getDigits(n,Nil)
}

输出:

scala> getDigits(123)
 res55: List[Int] = List(1, 2, 3)

scala> getDigits(12300)
 res56: List[Int] = List(1, 2, 3, 0, 0)

scala> getDigits(123001)
 res57: List[Int] = List(1, 2, 3, 0, 0, 1)

【讨论】:

  • List.unfold(1230)(n =&gt; Option.when(n &gt; 0)((n%10,n/10))).reverse
猜你喜欢
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
  • 2011-06-30
  • 2021-06-14
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
  • 1970-01-01
相关资源
最近更新 更多