Ho degli iteratori molto grandi che voglio dividere in pezzi. Ho un predicato che guarda un oggetto e restituisce true se è l'inizio di un nuovo pezzo. Ho bisogno che i pezzi siano degli iteratori, perché anche i pezzi non si adatteranno alla memoria. Ci sono così tanti pezzi che vorrei diffidare di una soluzione ricorsiva che spazza via il tuo stack. La situazione è simile a this question, ma ho bisogno di Iterators anziché di Lists e le "sentinelle" (voci per le quali il predicato è vero) si verificano (e dovrebbero essere incluse) all'inizio di un pezzo. Gli iteratori risultanti verranno utilizzati solo nell'ordine, anche se alcuni potrebbero non essere utilizzati affatto e dovrebbero utilizzare solo la memoria O (1). Immagino che questo significhi che dovrebbero condividere tutti lo stesso iteratore sottostante. Le prestazioni sono importanti.Scala: Raggruppa un Iterable in Iterable of Iterables secondo un predicato
Se dovessi prendere una pugnalata a una firma di funzione, sarebbe questo:
def groupby[T](iter: Iterator[T])(startsGroup: T => Boolean): Iterator[Iterator[T]] = ...
Mi sarebbe piaciuto usare takeWhile
, ma perde l'ultimo elemento. Ho studiato span
, ma buffer risultati. La mia migliore idea attuale riguarda lo BufferedIterator
, ma forse c'è un modo migliore.
Saprete che avete capito bene, perché una cosa del genere non va in crash JVM:
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))
Vedi http://stackoverflow.com/questions/5410846/how-do-i-apply-the-pimp-my-library-pattern-to-scala-collections/5411133#5411133 – huynhjl