2010-08-18 8 views
14

Tengo una serie de archivos de gran tamaño en los que deseo procesar todo menos la última línea de cada archivo. Si los archivos eran pequeños, tan sólo pudiera convertir en un TraversableLike y utilizar el método "init", ej .:todo excepto el último elemento de un iterador de Scala (a.k.a. Iterator.init)

lines.toList.init 

Sin embargo, los archivos son grandes, así que necesito para mantener las cosas como un iterador. ¿Hay una manera simple de obtener algo como "init" en un iterador? Estoy considerando la siguiente, pero no estoy seguro de que siempre funciona:

lines.takeWhile(_ => lines.hasNext) 
+2

¿Cuál es 'lines'? –

Respuesta

14

usted está confiando en takeWhile agarrar la siguiente línea en primer lugar, y después de comprobar para ver si hay otra línea. Funciona de esta manera en el iterador predeterminado. Y para cualquier iterador en particular, espero que si alguna vez funciona, siempre debería funcionar.

Si alguna vez falla, deberá almacenar en caché el resultado. Se podría hacer su propio iterador que hace esto, o, más fácilmente (si esto no es urgente código de rendimiento crítico):

lines.sliding(2).map(_.head) 

probar esto de la siguiente manera:

List(1,2,3,4,5).iterator.sliding(2).map(_.head).toList 

usted no lo hace tiene que confiar en takeWhile o cualquier otro método que se comporte de una manera particular; si sliding no está roto, tendrá el comportamiento anterior.

+0

¡Agradable! Tuve que mirarlo un poco para ver por qué funciona, pero parece menos hackish que mi solución. =) – Steve

3

Si desea omitir las 2 primeras líneas, y soltar el pasado 4 se podría repetir con

List(1, 2, 3).toIterable.drop(1).dropRight(1) 

Si ya tiene una IterableLike

il.drop(1).dropRight(1) 
+0

'List (1, 2, 3) .iterator.dropRight (1)' yields 'error: valor dropRight no es miembro de Iterator [Int]'. Por lo que puedo decir, al igual que 'init', no hay' dropRight' en Iterator. – Steve

Cuestiones relacionadas