次のスニペットは、数値を数字に分割するのに問題なく機能しますが、長すぎます。
val digits = (num toString).toList map(_.toString) map(_.toInt)
によって返される値ではなく、toString
適用されたときの実際の値を取得するようにマップしました。toInt
Int
Char
toList
私はScalaを初めて使用しますが、Scalaの表現スタイルには慣れていません。これを行うより短い方法はありますか?
scala> 123.toString.map(_.asDigit)
res0: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3)
(""+123).map(_-48)
文字通り最短だと思いますが、明快さがより重要な場合もあります。( !の'0'
代わりに少なくとも1つの余分な文字)48
文字列に変更せずに実行することもできます。
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)