2011-03-13 37 views
7

que necesito para poner en práctica un método genérico que toma una tupla y devuelve un mapa Ejemplo:iterar sobre una tupla

val tuple=((1,2),(("A","B"),("C",3)),4) 

He estado tratando de romper esta tupla en una lista:

val list=tuple.productIterator.toList 
Scala>list: List[Any] = List((1,2), ((A,B),(C,3)), 4) 

Pero de esta forma devuelve List [Any].

que estoy tratando ahora para averiguar la forma de repetición sobre la siguiente tupla, por ejemplo:

((1,2),(("A","B"),("C",3)),4) 

con el fin de bucle sobre cada elemento de 1,2, "A", B", ... etc. ¿Cómo podría hacer este tipo de iteración sobre la tupla

+0

No entiendo "devuelve un mapa". ¿Quieres algo así como un 'Seq' de todos los elementos de cualquier tupla y subtupla? –

Respuesta

14

¿Qué pasa:?

def flatProduct(t: Product): Iterator[Any] = t.productIterator.flatMap { 
    case p: Product => flatProduct(p) 
    case x => Iterator(x) 
} 
val tuple = ((1,2),(("A","B"),("C",3)),4) 
flatProduct(tuple).mkString(",") // 1,2,A,B,C,3,4 

Ok, el problema Any permanece. Al menos eso se debe al tipo de devolución de productIterator.

+2

No tengo ni idea, pero por alguna razón vuelvo a mirar tu publicación intencionalmente después de meses y me di cuenta de que tu forma de arreglar mi problema correctamente. Supongo que cuando publiques tu respuesta no podría entender a qué se refiere el Producto. Ahora tiene sentido . Thx Peter :) – Echo

2
tuple.productIterator map { 
    case (a,b) => println(a,b) 
    case (a) => println(a) 
} 
+0

hola, pero esta metodología no será genérica. ¿Hay alguna forma de iterar sobre cada variable de la tupla? Por ejemplo ((1,2), (("A", "B"), ("C", 3)), 4) ==> Resultado requerido: 1, 2, "A", "B", " c ", ... 4 – Echo

+0

Puede modificar la carcasa como lo desee. Por ejemplo: caso (a: Tuple2 [_, _], b: Tuple2 [_, _]) => haga algo con a y b. También puede hacer coincidir en Tuplas con tipos específicos. –

+0

Muchas gracias Tustem – Echo

2

En lugar de tuplas, use Shapeless estructuras de datos como HList. Puede tener un procesamiento genérico y no perder información de tipo.

El único problema es que la documentación no es muy completa.

0

Esto funciona para mí. tranform es una tupla que consta de marcos de datos

def apply_function(a: DataFrame) = a.write.format("parquet").save("..." + a + ".parquet") 
transform.productIterator.map(_.asInstanceOf[DataFrame]).foreach(a => apply_function(a))