【发布时间】:2012-06-19 02:59:35
【问题描述】:
我有 2 个集合:a 是 class C 的 Scala 对象序列。 b 是一个字符串序列。 C 有一个字符串字段name,它可能匹配b 中的项目。我想要的是遍历a 并找到与b 中的一项匹配的所有c.name。我如何在 Scala 中做到这一点?
【问题讨论】:
标签: scala
我有 2 个集合:a 是 class C 的 Scala 对象序列。 b 是一个字符串序列。 C 有一个字符串字段name,它可能匹配b 中的项目。我想要的是遍历a 并找到与b 中的一项匹配的所有c.name。我如何在 Scala 中做到这一点?
【问题讨论】:
标签: scala
遍历 a 和 b 可能会变得很昂贵,因为一个循环嵌套在另一个循环中会产生 O(n^2) 时间。如果 b 足够大,您可能希望先将其变为 Set 以将其降低到 O(n)。
val bSet = b.toSet;
a.filter(c => b.contains(c.name))
我会将其理解为“将以下过滤器应用于 a:对于 a 中的每个项目 c,当且仅当 c 的名称在 b 中时,将其包含在结果中。”
【讨论】:
contains 在Set 上速度很快(O(log n)),而在一般集合上速度很慢(O(n))。
这是等效的 for 循环与 yield。
for(c <- a if b.contains(c.name)) yield c.name
【讨论】: