2016-08-09 78 views
3

我正在研究代碼的編碼挑戰問題,我在第一天。我從一個只包含(((()(())((所以我想把每個'('到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) 

} 

錯誤輸出

error: type mismatch;

found : List[Char] => Int

required: Char => ?

val floor = source.map(findFloor) ^ one error found

我是我做錯了什麼?/我是什麼,我缺少什麼?

回答

2

斯卡拉map作品over an elements而不是整個收藏。試試這個:

val floor = source.map { 
    case '(' => 1 
    case ')' => -1 
}.sum 
+1

您可以放心地刪除'(_ match','.map {case ...}'也可以,它定義了部分匿名函數 –

+0

謝謝!但我試圖獲得source.map(findFloor)方法我可以告訴我給這個函數一個字符列表,它期望得到一個字符列表,所以我不明白這個問題是什麼。關閉了終端,在那裏我運行斯卡拉repl它的工作。 – Native

+0

@VictorMoroz謝謝!我已編輯我的答案 – vsminkov

0

如果你想以順序方式計算它們,你甚至可以使用foldLeft直​​接進行計算。

val computation = source.foldLeft(0)((a, b) => { 
    b match { 
     case '(' => a + 1 
     case ')' => a - 1 
    } 
}) 

它只是將所有值相加並返回累積值。對於(它正在添加和')'它正在減少。

第一個參數是起始值,a是前一步的值,b是實際的元素,因此是char。

0

您錯誤的原因可能是因爲沒有爲所有字符定義模式匹配。您錯過了所有其他匹配項,例如_ => 0。 另一個選擇是使用'collect',因爲它接受PartialFunction並忽略所有不匹配的元素。

建議的'摺疊'解決方案是我認爲的更好的方法。

+0

謝謝,我也會檢查一下。另外,我只需要2個案例,因爲我讀的文件只是字符'('和')'。很顯然,如果情況不同,我需要更多的案例來處理。 – Native

+0

但編譯器不知道文件中有2個不同的字符。再看一遍,我發現你與列表中的項目相匹配,而不是列表中的項目。要匹配元素,可以使用函數'map'或使用部分函數'collect'。 –

相關問題