Scala 分区和groupBy之间有什么区别?
我现在正在浏览Twitter的Scala学校,并正在研究收集的Scala 分区和groupBy之间有什么区别?,scala,Scala,我现在正在浏览Twitter的Scala学校,并正在研究收集的groupBy和partition方法。我不确定这两种方法的区别是什么 我自己做了一些测试: 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) re
groupBy
和partition
方法。我不确定这两种方法的区别是什么
我自己做了一些测试:
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
返回一个带有布尔键和列表值的映射?两者都具有相同的“效果”,即根据条件将列表拆分为两个不同的部分。我不知道为什么我会用一个而不是另一个。那么,我什么时候会在groupBy
上使用partition
,反之亦然 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"), ...)
很好,不是吗
我也不确定这两种方法有什么区别
是
区别在于他们的签名partition
需要一个函数a=>Boolean
,而groupBy
需要一个函数a=>K
在您的例子中,您应用的groupBy
函数似乎也是A=>Boolean
,但您不希望总是这样做,有时您希望按一个函数分组,该函数并不总是根据输入返回布尔值
例如,如果要按字符串的长度对字符串列表进行分组,则需要使用groupBy
进行分组
那么,我什么时候会在groupBy上使用分区,反之亦然
如果所应用函数的图像不在布尔集合中,则使用
groupBy
(即f(x)
对于输入x,产生的结果不是布尔值)。如果不是这样的话,那么您可以同时使用这两种方法,这取决于您是否喜欢使用映射
或(列表,列表)
作为输出。分区是指您需要根据是/否逻辑(偶数/奇数,大写/小写字母,您可以命名)将某个集合拆分为两个。GroupBy有更普遍的用法:基于某些函数生成许多组。假设您想根据单词的第一个字母(分为26组)将语料库拆分为多个存储箱,使用.partition
是不可能的