如何对列表中的元素使用模式匹配?

时间:2016-08-09 15:04:20

标签: scala design-patterns matching

我正在努力解决代码的编码挑战,并且我在第一天工作。我从一个只包含((()(())的文件中读取((所以我希望将每个'('转换为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)                                  ^发现一个错误

我在这里做错了什么? /我错过了什么?

3 个答案:

答案 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并忽略所有不匹配的元素。

我认为建议的'折叠'解决方案是更好的方法。