时间:2018-09-09 00:22:54

标签: scala collections kotlin grouping

我似乎找不到适用于Iterables的,相当于Kotlins groupingBy的简单Scala方法,该方法的行为类似于Scalas groupBy,但并不急于创建列表。相反,它创建了一个“分组”表示形式供以后使用。

例如,使用小型阵列,groupBy就足够了:

List(1, 2, 3, 4).groupBy(_ < 3) //Map(false -> List(3, 4), true -> List(1, 2))

但是对于大型或无限集合,如果我对不急于操作且仅对某些结果感兴趣的话,它将不会成立。

编辑:很抱歉,该示例未完全说明groupingBy的工作方式。如果输入的长度为n,它将输入分成1n组。在kotlin中,您写道:

listOf(1, 2, 3, 4).groupingBy(it % 3).eachCount() // { 0=1, 1=2, 2=1 }

您将获得一个中间Grouping对象,可以在该对象上应用诸如eachCount之类的终止操作,该操作会生成结果图。

1 个答案:

答案 0 :(得分:1)

可以分两个步骤完成。

val (t,f) = List(1, 2, 3, 4).partition(_ < 3)
val m = Map(true -> t, false -> f)
//Map[Boolean,List[Int]] = Map(true -> List(1, 2), false -> List(3, 4))

它也适用于延迟收集。

val (t,f) = Iterator.from(1).partition(_%3<1)
val m = Map(true -> t, false -> f)
//Map[Boolean,Iterator[Int]] = Map(true -> non-empty iterator, false -> non-empty iterator)

m(true).take(12).toList
//res0: List[Int] = List(3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36)

m(false).take(12).toList
//res1: List[Int] = List(1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17)