2011-09-03 9 views
13

Quiero dividir una cadena en palabras alternas. Siempre habrá un número par.de Split cadena en palabras alterna (Scala)

p. Ej.

val text = "this here is a test sentence" 

debe transformar a algún tipo colección ordenada que contiene

"this", "is", "test" 

y

"here", "a", "sentence" 

Yo he llegado con

val (l1, l2) = text.split(" ").zipWithIndex.partition(_._2 % 2 == 0) match { 
    case (a,b) => (a.map(_._1), b.map(_._1))} 

que me da los resultados correctos como dos matrices.

Se puede hacer esto de manera más elegante?

+0

@ Pablo de acuerdo, etiqueta borrada – elm

Respuesta

27
scala> val s = "this here is a test sentence" 
s: java.lang.String = this here is a test sentence 

scala> val List(l1, l2) = s.split(" ").grouped(2).toList.transpose 
l1: List[java.lang.String] = List(this, is, test) 
l2: List[java.lang.String] = List(here, a, sentence) 
+4

+1 para 'transpose' – agilesteel

+1

¡Qué solución más elegante! :) –

2

Así que, ¿qué tal esto: Scala> texto val = "esto aquí es una oración de prueba" texto: java.lang.String = esto aquí es una oración de prueba

scala> val Reg = """\s*(\w+)\s*(\w+)""".r 
Reg: scala.util.matching.Regex = \s*(\w+)\s*(\w+) 


scala> (for(Reg(x,y) <- Reg.findAllIn(text)) yield(x,y)).toList.unzip 
res8: (List[String], List[String]) = (List(this, is, test),List(here, a, sentence)) 

scala>