我似乎找不到适用于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
,它将输入分成1
到n
组。在kotlin中,您写道:
listOf(1, 2, 3, 4).groupingBy(it % 3).eachCount() // { 0=1, 1=2, 2=1 }
您将获得一个中间Grouping
对象,可以在该对象上应用诸如eachCount
之类的终止操作,该操作会生成结果图。
答案 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)