2012-05-17 23 views
3

我有很多項目的迭代器,所以我不能將它轉換爲Iterable for groupBy,並且不想將所有結果記錄在內存中。 但我知道所有的對象是由groupBy字段排序的,所以似乎可以爲排序後的迭代器實現groupBy ... scala集合中是否已經有一些方法可以做到這一點?在Scala中是否有迭代版本的groupBy?

回答

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 
    } 
    } 
+0

必須注意的是,這段代碼與其他集合上的'groupBy'完全不同。無論如何,需要遍歷整個集合的「真實」組,因此我懷疑你不能擁有內存中的解決方案。 – Rogach

+0

但是,假設「所有對象都按groupBy字段排序」,兩種方法都是相等的。 – yura

+0

啊。錯過了你的問題。 – Rogach

3

奇怪的是groupBy不上Iterator,但這個怎麼樣?

val it = Iterator(1, 2, 3) 
new Iterable[Int] { def iterator = it }.groupBy(_ % 2 == 0) 

看來工作(儘管它絕不是一種保障,因爲一個應該產生與Iterable每次都在同迭代器)。

+1

這是內存中的解決方案,但我想按大多數SQL數據庫的方式按無限大小集合進行分組...... – yura