Antecedentes:F #: ¿Cómo dividir una secuencia en una secuencia de secuencias
tengo una secuencia de datos contiguos, con fecha y hora. La secuencia de datos tiene lagunas en donde los datos no son contiguos. Quiero crear un método para dividir la secuencia en una secuencia de secuencias para que cada subsecuencia contenga datos contiguos (divida la secuencia de entrada en los espacios).
restricciones:
- El valor de retorno debe ser una secuencia de secuencias para asegurar que elementos se producen sólo cuando sea necesario (no se puede utilizar la lista/matriz/cacheing)
- La solución no debe ser O (n^2), probablemente descartando un patrón Seq.take - Seq.skip (Brian's post)
- Puntos extra para un enfoque funcionalmente idiomático (ya que quiero ser más competente en programación funcional), pero no es un requisito.
firma del método
let groupContiguousDataPoints (timeBetweenContiguousDataPoints : TimeSpan) (dataPointsWithHoles : seq<DateTime * float>) : (seq<seq< DateTime * float >>)= ...
En vista de ello el problema parecía trivial para mí, pero incluso empleando Seq.pairwise, IEnumerator < _>, por comprensión de la secuencia y las declaraciones de rendimiento, las soluciones elude yo. Estoy seguro de que esto se debe a que todavía carezco de experiencia con la combinación de los valores F # -idioms, o posiblemente porque hay algunas construcciones lingüísticas a las que aún no he estado expuesto.
// Test data
let numbers = {1.0..1000.0}
let baseTime = DateTime.Now
let contiguousTimeStamps = seq { for n in numbers ->baseTime.AddMinutes(n)}
let dataWithOccationalHoles = Seq.zip contiguousTimeStamps numbers |> Seq.filter (fun (dateTime, num) -> num % 77.0 <> 0.0) // Has a gap in the data every 77 items
let timeBetweenContiguousValues = (new TimeSpan(0,1,0))
dataWithOccationalHoles |> groupContiguousDataPoints timeBetweenContiguousValues |> Seq.iteri (fun i sequence -> printfn "Group %d has %d data-points: Head: %f" i (Seq.length sequence) (snd(Seq.hd sequence)))
Referencia cruzada: [aquí] (http://stackoverflow.com/questions/2071056/splitting -a-list-in-list-of-lists-based-on-predicate) es la misma pregunta, pero para las listas. – Benjol