2017-04-26 5 views
0

findMapに置き換えようとすると、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" 
} 
+0

これはなんですか?あなたは何をしようとしていますか?あなたが何をしたいと思っても、何が期待されているのでしょうか?どのように折りたたみと "何"を置き換えるには? –

+0

mapに値として少なくとも1つの0がある場合は、 "F"を、そうでなければ "T" –

+2

'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

あなたの試行では、これまで決定された結果が無視されます。あなたのものは 'var res =" "のようなものです。 for((key、value)< - s)res = if(値== 0) "F" else "T" 'したがって、1回の反復で0を検出すると、次の反復では無視され、結果が上書きされ、基本的にマップの最後の要素に基づいてTまたはFが返されます。だから私は '' T ''で始まり、0を見つけるまでそれを渡します。どちらの場合も' 'res''がその点から' 'F' 'になるので、両方の場合が" F "を返します。希望が助けてくれる!そうでない場合は、折り目が実際に何をするのかをもっと深く理解する必要があります。 – sgvd

関連する問題