【发布时间】:2016-03-10 06:10:44
【问题描述】:
有一些库(例如 Spark 和其他 Scala 扩展)具有可用的“groupWith”函数。此功能允许您将一个元素与集合的其余部分进行比较,然后使用一个或多个谓词对其进行分组。 Scala 中似乎没有为此提供任何本机功能,但它们确实具有行为相似的 sortWith 函数,但仅对项目进行排序而不是对它们进行分组。如果解释不充分,这里有一个小代码示例,应该显示我正在尝试做的事情:
val list = List(1,2,3,4,5,5)
val groupedList = list.groupWith{ (e,c) =>
e == c
}
这是一个很简单的例子,我想做更复杂的比较比如
e + 1 == c
那么问题是有没有任何原生的 Scala 函数可以做到这一点?有什么建议或解决方法吗?
更新: 从给出的简单示例看来,我要做什么并不完全清楚,这是一个更好的示例: 假设我有一个案例类和这些对象的列表:
case class Item(num: Int, color: String)
val list = List(new Item(13, "red"), new Item(14,"red"), new Item(15, "blue"), new Item(16, "red"))
list.groupWith{ (e,c) =>
(e.num -1 == c.num || e.num + 1 == c.num ) && e.color == c.color
}
这应该返回如下内容:
res8: List[List[Item]] = List(List(Item(13,red), Item(14,red)), List(Item(15,blue)), List(Item(16,red)))
【问题讨论】:
-
你告诉我们,那些不熟悉 Spark groupWith 的人,你对这两种情况的结果都是
groupedList? -
我缺少
groupWith的语义。 -
你只是想要成对分组,它们是按顺序排列的,即对于 (1, 3, 2, 3) 和 (e, e+1) 是否返回 (1, 2), (2 ,3), (2,3) 还是只是 (2,3)?
-
如果与组中的任何现有成员相比,如果它们通过谓词,那么事情最终会在组中吗?这显然是 O(N^2),可以吗?
-
是的,这与其说是生产代码问题,不如说是一个好奇心,如果您查看本机 sortWith 函数,我想它具有相同的复杂性。
标签: scala