2017-04-26 34 views
0

試圖用Map代替findfold沒有成功。 我做了一個簡單的例子,以不深入我的類型的細節。 如何用fold替換它?斯卡拉地圖摺疊而不是發現

val s: Map[String, Int] = Map("1" -> 1, "2" -> 0, "3" -> 1) 

s.find(_._2 == 0) match { 
    case Some((_, 0)) => "F" 
    case _ => "T" 
} 
+0

這是什麼?你想做什麼?無論你想做什麼,應該是什麼樣的預期產出?如何用摺疊取代「什麼」? –

+0

如果地圖至少有一個0作爲值,我應該得到「F」,在其他情況下 - 「T」 –

+2

而你爲什麼要用'fold'來做呢?因爲即使在找到答案之後,fold也會繼續遍歷地圖(找到0並因此成爲「F」)。 –

回答

2

雖然確實可能比您的問題摺疊更好的解決方案,這是回答你的問題:

val s: Map[String, Int] = Map("1" -> 1, "2" -> 0, "3" -> 1) 

s.foldLeft("T") { 
    case (_, (_, 0)) => "F" 
    case (res, _) => res 
} 

的一點是,你必須保持傳遞結果採了遠在默認情況下。

+0

謝謝! 你能解釋一下爲什麼有foldLeft(「T」)? 我試圖做到這一點,我的方法可以使穿越,不返回正確的答案 's.foldLeft( 「」){情況(一,(K,V))=>'' 比賽v {' 'case 0 =>「F」' 'case _ =>「T」' '}' '}' –

+1

您的嘗試忽略了迄今爲止確定的結果,在您的情況下爲'a'。你的類似於'var res =「」; for((key,value)< - s)res = if(value == 0)「F」else「T」'。因此,如果在一次迭代中發現0,它會忽略下一次並覆蓋結果,基本上只是基於地圖中最後一個元素返回T或F.所以我以''T''開始,並且將它傳遞給它,直到它找到一個0,從這一點開始,這兩個例子都會返回「F」(因爲'res'將從那一點開始爲「F」)。希望有所幫助!如果不是的話,你應該更深入地瞭解摺疊實際上做了什麼。 – sgvd