2012-05-17 2 views
3

나는 iterator가 많은 항목을 가지고 있으므로 groupBy에 대한 Iterable로 변환 할 수 없으며 memmory에서 모든 결과를 소트하고 싶지 않습니다. 하지만 모든 객체가 groupBy 필드에 의해 정렬된다는 것을 알고 있으므로 정렬 된 반복자에 대해 groupBy를 구현할 수 있습니다. 이미이 작업을 수행하는 스칼라 컬렉션에 몇 가지 메소드가 있습니까?스칼라에 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에없는,하지만 어떻게? (이 하나 같은 반복자 Iterable와 모든 시간을 생산해야한다는 주어진 보장 결코 비록)

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

작동하는 것 같다.

+1

이것은 메모리 내 솔루션이지만 대부분의 SQL 데이터베이스와 동일한 방식으로 무한 크기 컬렉션을 그룹화하려는 경우 ... – yura