【问题标题】:Scala iterating through 2 collections and finding matchesScala 遍历 2 个集合并找到匹配项
【发布时间】:2012-06-19 02:59:35
【问题描述】:

我有 2 个集合:aclass C 的 Scala 对象序列。 b 是一个字符串序列。 C 有一个字符串字段name,它可能匹配b 中的项目。我想要的是遍历a 并找到与b 中的一项匹配的所有c.name。我如何在 Scala 中做到这一点?

【问题讨论】:

    标签: scala


    【解决方案1】:

    遍历 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 中时,将其包含在结果中。”

    【讨论】:

    • 你我的朋友是摇滚明星!谢谢,
    • 如果 b 足够大,你可能想先把它变成一个 Set,例如: val bSet = b.toSet; a.filter(c => b.contains(c.name))
    • 感谢 Alex 的建议,但为什么要先将其设为 Set 并定义足够大。
    • 因为containsSet 上速度很快(O(log n)),而在一般集合上速度很慢(O(n))。
    • @AlexCruise 感谢您关注这一点。最初的答案说要让它成为一个集合,但没有说明如何或为什么。
    【解决方案2】:

    这是等效的 for 循环与 yield。

    for(c <- a if b.contains(c.name)) yield c.name
    

    【讨论】:

      猜你喜欢
      • 2019-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-07
      • 2022-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多