2012-06-28 39 views

Respuesta

58
val xs = List(1,2,3,4) 
xs zip xs.tail 
    // res1: List[(Int, Int)] = List((1,2), (2,3), (3,4)) 

Como dicen los docs, zip

Devuelve una lista formada a partir de esta lista y otra colección iterable combinando elementos correspondientes en pares. Si una de las dos colecciones es más larga que la otra, sus elementos restantes son ignorados.

Así List('a,'b,'c,'d) cremallera con List('x,'y,'z) es List(('a,'x), ('b,'y), ('c,'z)) con la final 'd de la primera ignorado.

De su ejemplo, el tail de List(1,2,3,4) es List(2,3,4) para que pueda ver cómo se comprimen juntos en pares.

+1

Esto es corto e inteligente, pero es más difícil de entender, creo. –

+3

Esta sería mi primera opción por concisión y claridad. Tener un voto favorable. – Brian

+1

@Luigi: Volví a subir esta respuesta y la prefiero a la actualmente aceptada, pero una explicación sería más útil que "jaja si crees que es difícil de entender". –

10

para producir una lista de pares (es decir tuplas) probar este

List(1,2,3,4,5).sliding(2).collect{case List(a,b) => (a,b)}.toList 
+1

Use 'map' en lugar de' collect' - esto ahorrará una llamada 'isDefinedAt' y lanzar una excepción si no todos, de repente, su colección original es un' list' más, en lugar de producir un silencio resultado vacío Por esta misma razón, probablemente debería emparejar el patrón 'Seq (a, b)' en lugar de 'List (a, b)'. –

6
List(1,2,3,4).sliding(2).map(x => (x.head, x.tail.head)).toList 
res0: List[(Int, Int)] = List((1,2), (2,3), (3,4)) 
+1

Esta es la respuesta que surgió también cuando lo escribí. Parece más obvio y legible que el resto. – arviman

+0

@arviman Esto es lo que se me ocurrió en ese momento. Probablemente estaba tratando de forzar el uso de 'deslizamiento'. En retrospectiva, la respuesta aceptada es mucho mejor. – Brian

Cuestiones relacionadas