Scala寻找更优雅的方式

Scala寻找更优雅的方式,scala,functional-programming,Scala,Functional Programming,我不熟悉Scala和函数式编程 我在解决一个问题,你们必须先读取数字,然后读取整数的数量。然后,您应该计算所有整数中所有数字的总和 这是我的密码 def sumDigits(line: String) = line.foldLeft(0)(_ + _.toInt - '0'.toInt) def main(args: Array[String]) { val numberOfLines = Console.readInt val lines = for (i &l

我不熟悉Scala和函数式编程

我在解决一个问题,你们必须先读取数字,然后读取整数的数量。然后,您应该计算所有整数中所有数字的总和

这是我的密码

def sumDigits(line: String) = 
    line.foldLeft(0)(_ + _.toInt - '0'.toInt)

  def main(args: Array[String]) {
    val numberOfLines = Console.readInt
    val lines = for (i <- 1 to numberOfLines) yield Console.readLine   
    println(lines.foldLeft(0)( _ + sumDigits(_)))
  }
def sumdights(行:字符串)=
行foldLeft(0)(u+u.toInt-'0'.toInt)
def main(参数:数组[字符串]){
val numberOfLines=Console.readInt
val lines=for(i
sumdights()
可以通过
sum
更容易实现:

def sumDigits(line: String) = line.map(_.asDigit).sum
lines.map(sumDigits).sum
第二个
foldLeft()
也可以替换为
sum

def sumDigits(line: String) = line.map(_.asDigit).sum
lines.map(sumDigits).sum
这就带来了最终版本(注意没有
main
,而是extend
App
):


首先,您必须在
上进行某种解析,以分离现有的十进制整数子字符串:

val numbers = "5 1 4 9 16 25"
val ints = numbers.split("\\s+").toList.map(_.toInt)
然后,您希望将第一个作为计数,并保留其余的进行解码和求和:

val count :: numbers = ints
然后使用内置的求和方法:

val sum = numbers.sum
在REPL中:

scala> val numbers = "5 1 4 9 16 25"
numbers: String = 5 1 4 9 16 25

scala> val ints = numbers.split("\\s+").toList.map(_.toInt)
ints: List[Int] = List(5, 1, 4, 9, 16, 25)

scala> val count :: numbers = ints
count: Int = 5
numbers: List[Int] = List(1, 4, 9, 16, 25)

scala> val sum = numbers.sum
sum: Int = 55
如果要对前导数字计数执行某些操作,可以验证它是否正确:

scala> assert(count == numbers.length)
由于断言通过,因此不会产生任何输出。

一行回答:

 Iterator.continually(Console.readLine).take(Console.readInt).toList.flatten.map(_.asDigit).sum

我喜欢简洁的代码,所以我可能(如果我真的是为了简洁)


它设置内联的行数并在执行过程中进行处理。不过,没有错误检查。您可以在
读取行之后插入
.filter(u.isDigit)
以至少丢弃非数字。您还可以
定义p[a](a:a)={println(a);a}
并将读取的内容包装在
p
中,这样您就可以看到键入的内容(默认情况下,在某些平台上,至少屏幕上没有回声).

既然你已经做得很好了,我就放弃了我的答案。用一个
.asDigit
替换
toInt
减法。更多的优点是:将外部的
映射
转换成
平面映射
,并去掉内部的
。求和
。结果也可以转换成一个用于理解的数字,然后再进行分析获取
sum
ed。他需要整数位数的和。
object Reads extends App {
  import Console._
  println( Seq.fill(readInt){readLine.map(_ - '0').sum}.sum )
}