2012-06-10 6 views
7

Tengo una lista que quiero dividir de manera similar al método (partition sz step col) de Clojure o la función IterableLike.sliding(size: Int, step: Int) de Scala. Específicamente, dada una lista como:¿Puedes replicar Clojure (partición) o las funciones deslizantes() de Scala con Guava?

(1, 2, 3) 

Quiero ser capaz de iterar sobre las sub-listas como:

(1, 2), (2, 3) 

En Clojure esto se haría con:

(partition 2 1 (1, 2, 3)) 

y con Scala sería:

val it = Vector(1, 2, 3).sliding(2) 

Sin embargo, no tengo tanto lujo y espero evitar tener que hacer mi propio trabajo. Guava tiene un método de partición que se acerca, pero no ofrece la superposición. Google ha sido infructuoso también. ¿Existe tal método o tendré que hacer el mío?

+1

si nadie sabe de algo mejor podría fusionar dos particiones de guayaba, donde la segunda es de una secuencia con un elemento eliminado ... –

+0

¿No necesitaría particiones * size *? Buena idea sin embargo. –

+0

Puede usar el mapa, algo así como: '(map (fn [xy] '(x, y)) lst (rest lst))' – Ankur

Respuesta

1

Guava no tiene nada como esto en este momento, pero si presenta un issue, podemos analizar agregarlo.

Para mí, usaría un ArrayDeque para almacenar la ventana en ejecución, pero eso no tendría sentido para un método de biblioteca.

+0

Problema archivado en http://code.google.com/p/guava-libraries/issues/detail?id=1027. –

2

La guayaba no tiene esto, pero es probable que AbstractIterator haga "rodar el suyo" más fácilmente.

Puede que ya haya una feature request solicitada; si no, siéntete libre.

Cuestiones relacionadas