我希望創建一個按名稱鍵入的Map,其中包含具有該名稱的事物的計數。我有一個名稱列表,其中可能包含多個具有相同名稱的項目。編碼這樣我得到一個錯誤「類型不匹配;發現:字符串要求:(字符串,整數)」:爲什麼我必須明確指出Tuple2(a,b)能夠在foldLeft中使用Map add?
//variation 0, produces error
(Map[String, Int]() /: entries)((r, c) => { r + (c.name, if (r.contains(c.name)) (c.name) + 1 else 1) })
這讓我困惑,因爲我雖然(A,B)是一個Tuple2,因此適用於使用地圖添加。以下任一變體均可按預期工作:
//variation 1, works
(Map[String, Int]() /: entries)((r, c) => { r + Tuple2(c.name, if (r.contains(c.name)) (c.name) + 1 else 1) })
//variation 2, works
(Map[String, Int]() /: entries)((r, c) => {
val e = (c.name, if (r.contains(c.name)) (c.name) + 1 else 1) })
r + e
我不清楚爲什麼我的第一個版本出現問題;任何人都可以建議。我正在使用Scala-IDE 2.0.0 beta 2來編輯源代碼;該錯誤來自Eclipse Problems窗口。
條目groupBy(_.name)mapValues(_.length)// SO正在吃我的下劃線 – 2011-05-09 19:25:05
根據'entries'類型和長度的不同,這可能會導致很多糟糕的結果。 – 2011-05-09 20:04:35
我認爲這將永遠是一個常數因子較慢。這取決於你的域名仍然可以被認爲是「很多」。 – 2011-05-09 22:45:44