【发布时间】:2011-08-21 21:36:40
【问题描述】:
我希望创建一个以名称为键的地图,其中包含具有该名称的事物的数量。我有一个带有名称的事物列表,其中可能包含多个具有相同名称的项目。像这样编码我得到一个错误“类型不匹配;发现:需要字符串:(字符串,整数)”:
//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,因此适合与 Map add 一起使用。以下任一变体均按预期工作:
//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 问题窗口。
【问题讨论】:
-
entries groupBy (.name) mapValues (.length) // 所以正在吃我的下划线
-
根据
entries的类型和长度,这可能会执行很多更差。 -
我认为它总是会变慢。其中,根据您的域,仍然可以被认为是“很多”。
标签: scala tuples scala-collections