試圖用Map
代替find
與fold
沒有成功。 我做了一個簡單的例子,以不深入我的類型的細節。 如何用fold
替換它?斯卡拉地圖摺疊而不是發現
val s: Map[String, Int] = Map("1" -> 1, "2" -> 0, "3" -> 1)
s.find(_._2 == 0) match {
case Some((_, 0)) => "F"
case _ => "T"
}
試圖用Map
代替find
與fold
沒有成功。 我做了一個簡單的例子,以不深入我的類型的細節。 如何用fold
替換它?斯卡拉地圖摺疊而不是發現
val s: Map[String, Int] = Map("1" -> 1, "2" -> 0, "3" -> 1)
s.find(_._2 == 0) match {
case Some((_, 0)) => "F"
case _ => "T"
}
雖然確實可能比您的問題摺疊更好的解決方案,這是回答你的問題:
val s: Map[String, Int] = Map("1" -> 1, "2" -> 0, "3" -> 1)
s.foldLeft("T") {
case (_, (_, 0)) => "F"
case (res, _) => res
}
的一點是,你必須保持傳遞結果採了遠在默認情況下。
謝謝! 你能解釋一下爲什麼有foldLeft(「T」)? 我試圖做到這一點,我的方法可以使穿越,不返回正確的答案 's.foldLeft( 「」){情況(一,(K,V))=>'' 比賽v {' 'case 0 =>「F」' 'case _ =>「T」' '}' '}' –
您的嘗試忽略了迄今爲止確定的結果,在您的情況下爲'a'。你的類似於'var res =「」; for((key,value)< - s)res = if(value == 0)「F」else「T」'。因此,如果在一次迭代中發現0,它會忽略下一次並覆蓋結果,基本上只是基於地圖中最後一個元素返回T或F.所以我以''T''開始,並且將它傳遞給它,直到它找到一個0,從這一點開始,這兩個例子都會返回「F」(因爲'res'將從那一點開始爲「F」)。希望有所幫助!如果不是的話,你應該更深入地瞭解摺疊實際上做了什麼。 – sgvd
這是什麼?你想做什麼?無論你想做什麼,應該是什麼樣的預期產出?如何用摺疊取代「什麼」? –
如果地圖至少有一個0作爲值,我應該得到「F」,在其他情況下 - 「T」 –
而你爲什麼要用'fold'來做呢?因爲即使在找到答案之後,fold也會繼續遍歷地圖(找到0並因此成爲「F」)。 –