Parçalara ayırmak istediğim çok büyük yineleyiciler var. Yeni bir parçanın başlangıcıysa, bir öğeye bakıp doğru olan bir yüklemem var. Yineleyici olacak parçalara ihtiyacım var, çünkü parçalar bile belleğe sığmayacak. Yığını dışarı üfleyen özyinelemeli bir çözümden kaçınacağım kadar çok parça var. Durum this question'a benzer, ancak Listeler yerine yineleyicilere ihtiyacım var ve bir parçanın başında "sentinel" (yüklemin doğru olduğu öğeler) meydana gelir (ve dahil edilmeli). Sonuçta meydana gelen yineleyiciler sadece sırayla kullanılır, ancak bazıları hiç kullanılmayabilir ve sadece O (1) belleğini kullanmalıdır. Bunun hepsinin aynı temel yineleyiciyi paylaşması gerektiği anlamına geldiğini hayal ediyorum. Performans önemlidir. Ben bir işlev imza bir bıçak almak için olsaydıScala: Yinelemeli bir yinelenebilir duruma dönüşebilir bir grup oluşturun
, bu şöyle olacaktır:
def groupby[T](iter: Iterator[T])(startsGroup: T => Boolean): Iterator[Iterator[T]] = ...
Ben takeWhile
kullanmak isterdim ama son elemanını kaybeder. span
'u araştırdım, ancak arabellek sonuçları. Şu anki en iyi fikrim BufferedIterator
içeriyor ama belki daha iyi bir yol var.
Sen böyle bir şey senin JVM çökmez doğru çünkü var bileceksiniz:
groupby((1 to Int.MaxValue).iterator)(_ % (Int.MaxValue/2) == 0).foreach(group => println(group.sum))
groupby((1 to Int.MaxValue).iterator)(_ % 10 == 0).foreach(group => println(group.sum))
bakınız http://stackoverflow.com/questions/5410846/how-do-i-apply-the-pimp-my-library-pattern-to-scala-collections/5411133#5411133 – huynhjl