我正在努力解决代码的编码挑战,并且我在第一天工作。我从一个只包含((()(())的文件中读取((所以我希望将每个'('转换为1)和每个' )'到-1,所以我可以计算它们。但是当我映射 findFloor而不是源时,我遇到了问题。我得到了类型不匹配。一切看起来都对我而且这是奇怪的部分,因为它不起作用。
import scala.io._
object Advent1 extends App {
// Read from file
val source = Source.fromFile("floor1-Input.txt").toList
// Replace each '(' with 1 and each ')' with -1, return List[Int]
def findFloor(input: List[Char]):Int = input match {
case _ if input.contains('(') => 1
case _ if input.contains(')') => -1
}
val floor = source.map(findFloor)
}
错误输出
错误:类型不匹配;
发现:列表[Char] => INT
必需:Char => ?
val floor = source.map(findFloor) ^发现一个错误
我在这里做错了什么? /我错过了什么?
答案 0 :(得分:2)
Scala map
工作over an elements而不是整个集合。试试这个:
val floor = source.map {
case '(' => 1
case ')' => -1
}.sum
答案 1 :(得分:0)
如果您想以顺序方式计算它们,您甚至可以使用foldLeft直接进行计算。
val computation = source.foldLeft(0)( (a, b) => {
b match {
case '(' => a + 1
case ')' => a - 1
}
})
它只是将所有值相加并返回累计值。对于(它正在添加和用于')'它的减少。
第一个参数是起始值,a是上一步的值,b是实际元素,因此是char。
答案 2 :(得分:0)
可能是因为没有为所有字符定义模式匹配而导致错误。您错过了所有其他人的匹配,案例_ =>例如0。 另一种选择是使用'collect',因为它接受PartialFunction并忽略所有不匹配的元素。
我认为建议的'折叠'解决方案是更好的方法。