나는 iterator가 많은 항목을 가지고 있으므로 groupBy에 대한 Iterable로 변환 할 수 없으며 memmory에서 모든 결과를 소트하고 싶지 않습니다. 하지만 모든 객체가 groupBy 필드에 의해 정렬된다는 것을 알고 있으므로 정렬 된 반복자에 대해 groupBy를 구현할 수 있습니다. 이미이 작업을 수행하는 스칼라 컬렉션에 몇 가지 메소드가 있습니까?스칼라에 groupBy의 반복 버전이 있습니까?
3
A
답변
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
}
}
3
이상한 groupBy
것을 이것에 대해 Iterator
에없는,하지만 어떻게? (이 하나 가 같은 반복자 Iterable
와 모든 시간을 생산해야한다는 주어진 보장 결코 비록)
val it = Iterator(1, 2, 3)
new Iterable[Int] { def iterator = it }.groupBy(_ % 2 == 0)
작동하는 것 같다.
+1
이것은 메모리 내 솔루션이지만 대부분의 SQL 데이터베이스와 동일한 방식으로 무한 크기 컬렉션을 그룹화하려는 경우 ... – yura
이 코드는 다른 콜렉션에서'groupBy'와 다른 점을 유의해야합니다. 어쨌든 "실제"그룹은 전체 컬렉션을 탐색해야하므로 인 메모리 솔루션을 사용할 수 없다고 생각합니다. – Rogach
그러나 "모든 객체가 groupBy 필드로 정렬되었습니다"라고 가정하면 두 방법이 동일합니다. – yura
아. 귀하의 질문에 그것을 놓쳤습니다. – Rogach