【问题标题】:Scala equivalent of Kotlins groupingByScala 等价于 Kotlins groupingBy
【发布时间】:2018-09-09 00:22:54
【问题描述】:

我似乎找不到可用于 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,它会生成结果图。

【问题讨论】:

  • 您需要地图作为结果吗?在 Scala 中使用无限集合的唯一方法是使用 Stream 或 Iterator。
  • 是的,我需要一张地图。我已经编辑了我的问题以展示 kotlins groupingBy 的扩展功能。

标签: scala collections kotlin grouping


【解决方案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)

【讨论】:

  • 是的,我一直在考虑更新的信息。唉,groupBy() is 渴望,除了partition() 之外,我没有找到方便的方法来划分惰性集合,它只会将它分成两个,true 和 假,部分。是时候提出功能请求了。
猜你喜欢
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
相关资源
最近更新 更多