【问题标题】:What is the difference between partition and groupBy?partition 和 groupBy 有什么区别?
【发布时间】:2016-07-17 21:20:50
【问题描述】:

我现在正在阅读 Twitter 的 Scala School,并且正在查看 groupBypartition 集合方法。而且我不确定这两种方法之间的区别是什么。

我自己做了一些测试:

scala> List(1, 2, 3, 4, 5, 6).partition(_ % 2 == 0)
res8: (List[Int], List[Int]) = (List(2, 4, 6),List(1, 3, 5))

scala> List(1, 2, 3, 4, 5, 6).groupBy(_ % 2 == 0)
res9: scala.collection.immutable.Map[Boolean,List[Int]] = Map(false -> List(1, 3, 5), true -> List(2, 4, 6))

这是否意味着partition 返回一个包含两个列表的列表,而groupBy 返回一个带有布尔键和列表值的 Map?两者都具有根据条件将列表分成两个不同部分的相同“效果”。我不确定为什么我会使用其中一个。那么,我什么时候可以使用partition 而不是groupBy,反之亦然?

【问题讨论】:

    标签: scala


    【解决方案1】:

    groupBy 更适合更复杂的对象列表。

    说,你有一个班级:

    case class Beer(name: String, cityOfBrewery: String)
    

    还有啤酒清单:

    val beers = List(Beer("Bitburger", "Bitburg"), Beer("Frueh", "Cologne") ...)
    

    然后您可以按cityOfBrewery 对啤​​酒进行分组:

    val beersByCity = beers.groupBy(_.cityOfBrewery)
    

    现在您可以获取数据中任何城市酿造的所有啤酒的列表:

    val beersByCity("Cologne") = List(Beer("Frueh", "Cologne"), ...)
    

    整洁,不是吗?

    【讨论】:

      【解决方案2】:

      而且我不确定这两种方法有什么区别 是。

      区别在于他们的签名。 partition 需要一个函数 A => Boolean,而 groupBy 需要一个函数 A => K

      在您的情况下,您使用groupBy 应用的函数似乎也是A => Boolean,但您不希望总是这样做,有时您希望按一个并不总是返回布尔值的函数进行分组基于其输入。

      例如,如果您想按长度对字符串列表进行分组,则需要使用groupBy

      那么,我什么时候可以在 groupBy 上使用分区,反之亦然?

      如果您应用的函数的图像不在布尔集合中,请使用 groupBy(即,f(x) 对于输入 x 会产生不同于布尔值的结果)。如果不是这种情况,那么您可以同时使用两者,这取决于您是喜欢 Map 还是 (List, List) 作为输出。

      【讨论】:

        【解决方案3】:

        分区是当您需要根据是/否逻辑(偶数/奇数、大写/小写字母,您自己命名)将某个集合分成两个时。 GroupBy 有更一般的用法:根据某些功能生成许多组。假设您想根据单词的首字母将语料库分成垃圾箱(结果分为 26 组),这对于 .partition 来说是不可能的。

        【讨论】:

          猜你喜欢
          • 2020-04-25
          • 2020-06-22
          • 1970-01-01
          • 2016-08-30
          • 1970-01-01
          • 1970-01-01
          • 2010-10-02
          • 2011-12-12
          • 2010-09-16
          相关资源
          最近更新 更多