我从Java开始使用Scala,
此时我正在尝试解决简单算法,基本上是hh:mm
到分钟之间的对话,以尝试尽可能多的scala功能。我的代码现在就是这个(它有效)
def hourToMins(time : String):String =
time.split(':').reduce(((a:String, b: String)=> a.toInt * 60 + b.toInt + ""))
但是,如果我在最后删除+ ""
并将函数的返回类型更改为Int,则无效
def hourToMins(time : String):Int=
time.split(':').reduce(((a:String, b: String)=> a.toInt * 60 + b.toInt ))
found : (String, String) => Int required: (Any, Any) => Any
即使我更改了它,也可以向Int添加显式转换,如
def hourToMins(time : String):Int=
time.split(':').reduce(((a:String, b: String)=> (a.toInt * 60 + b.toInt ).toInt)
似乎这个版本也期望这两个参数是Int :(
def hourToMins(time : String):Int=
time.split(':').reduce[Int](((a:String, b: String)=> a.toInt * 60 + b.toInt ))
不能使它发挥作用。
这样做的正确方法是什么,我做错了什么?
答案 0 :(得分:8)
您的列表项的类型与结果不同。 reduce
函数不允许这样做,但foldLeft
会这样做。您只需要0
作为起始值。
"01:01".split(':').foldLeft(0) {
(a, b) => a * 60 + b.toInt
}
这将返回61。
答案 1 :(得分:6)
我会一步一步地做事。
首先进行类型转换然后执行reduce。
def hourToMins(time : String): Int =
time.split(':')
.map(s => s.toInt)
.reduce(((h, m) => h * 60 + m))