2016-05-24 1 views
1

このコードはScalaの明確化に折りたたみ

var r = 0 
arr.foreach { s => 
    val count = arr.count(_ == s) 
    if (count > r) r = count 
} 

を動作しますが、折り目の場合には、操作

を折り曲げて、コードの一部を改善したいです。タイプに間違いがあります。

Error:(44, 49) type mismatch; 
found : (Int, String) => Any 
required: (Any, Any) => Any 
     arr.fold(0: Int)((result: Int, s: String) => { 
               ^

    arr.fold(0: Int)((result: Int, s: String) => { 
    val count = arr.count(_ == s) 
    if (count > result) count 
    }) 

どうしたのですか?あなたは、配列の中で最も出現して文字列を検索しようとしている場合

答えて

2

、あなたがgroupBy使用することができます。

val arr = Array("yuval", "yuval", "david") 
arr.groupBy(identity).mapValues(_.length).max._2 

arr: Array[String] = Array(yuval, yuval, david) 
res1: Int = 2 

あなたが本当に倍使用するのではフープにジャンプしたい場合は、いずれかの必要がよfoldLeftまたはfoldRightは、アキュムレータをシーケンス内の各値に沿って通過させます。

val arr = Array("yuval", "yuval", "david") 
val aggregatedMap = arr.foldLeft(Map.empty[String, Int].withDefaultValue(0)) { 
    case (map, value) => map.updated(value, map(value) + 1) 
} 

println(aggregatedMap.max._2) 
関連する問題