【问题标题】:Filtering a Seq of Tuple3 using one element of each Tuple使用每个 Tuple 的一个元素过滤 Tuple3 的 Seq
【发布时间】:2012-05-15 12:37:45
【问题描述】:

我有一个 SeqTuple3 元素。 我想要一个由每个元组的 second 元素组成的结果集合(可能是Set)。

例如

(a, b, c), (d, e, f), (g, h, i) ==> (b, e, h)

有什么想法吗?我进行了很多搜索,但我发现的所有内容都与过滤元组有关,而不是在它们内部,如果这有意义的话。

我对 Scala 还是很陌生,学习是一个漫长的过程 :) 感谢您的帮助。

【问题讨论】:

    标签: scala tuples seq


    【解决方案1】:

    根据您对所需内容的描述,即Seq[(A, B, C)] => Set[B] 类型的某些功能,您需要映射,而不是过滤。例如,

    scala> Seq(('a', "foo", 1), ('b', "bar", 2)).map(_._2).toSet
    res0: scala.collection.immutable.Set[java.lang.String] = Set(foo, bar)
    

    【讨论】:

      【解决方案2】:

      如果您不喜欢笨拙的元组访问器(_1、_2 等),可以在其中使用模式匹配的“部分函数文字”:

      scala> Seq(('a', "foo", 1), ('b', "bar", 2)) map { case (_, x, _) => x } toSet
      res1: scala.collection.immutable.Set[java.lang.String] = Set(foo, bar)
      

      【讨论】:

      • 老实说,我没有发现它们比您的部分函数文字更笨拙,但无论如何感谢这种替代方法。很有趣。
      • 是的,在这种情况下,我也会选择另一种方法。如果您需要访问元组的所有部分,则使用大小写和元组模式变得特别棒。然后给零件起一个合理的名字比多次使用 _x 更容易理解。
      • 同意,这看起来真的很强大
      【解决方案3】:

      yourSeqOfTuples.map(tuple => tuple._2).toSet,可简写为yourSeqOfTuples.map(_._2).toSet

      如果您愿意,可以使用 {} 而不是 ()。 _2 是获取元组第二个元素的方法。

      【讨论】:

      • 你和 Ben James 同时给了我同样的答案,你会得到额外的解释。谢谢。
      猜你喜欢
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 2013-01-29
      • 1970-01-01
      • 2020-06-10
      • 1970-01-01
      • 2020-09-06
      相关资源
      最近更新 更多