我有很多项目的迭代器,所以我不能将它转换为Iterable for groupBy并且不想将所有结果都存储在memmory中。 但是我知道所有对象都是由groupBy字段排序的,因此似乎可以为已排序的迭代器实现groupBy ... scala集合中是否已经有一些方法来执行此操作?
答案 0 :(得分:4)
我的解决方案:
def iterativeGroupBy[T, B](iterO: Iterator[T])(func: T => B): Iterator[List[T]] = new Iterator[List[T]] {
var iter = iterO
def hasNext = iter.hasNext
def next = {
val first = iter.next()
val firstValue = func(first)
val (i1,i2) = iter.span(el => func(el) == firstValue)
iter = i2
first :: i1.toList
}
}
答案 1 :(得分:3)
奇怪groupBy
不在Iterator
,但是这个怎么样?
val it = Iterator(1, 2, 3)
new Iterable[Int] { def iterator = it }.groupBy(_ % 2 == 0)
它似乎有效(虽然它并不能保证,因为每次 应该每次使用Iterable
生成相同的迭代器)。