2011-03-13 17 views
7

ho bisogno di implementare un metodo generico che prende una tupla e restituisce una mappa Esempio:iterazioni su una tupla

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

Ho cercato di rompere questo tupla in una lista:

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

Ma in questo modo restituisce Elenco [Qualsiasi].

Sto cercando ora di scoprire come per scorrere i seguenti tupla, per esempio:

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

al fine di un ciclo su ogni elemento 1,2, "A", B", ... ecc Come potrei fare questo tipo di iterazione su tupla

+0

Non capisco "restituisce una mappa". Vuoi qualcosa come un 'Seq' di tutti gli elementi di qualsiasi tupla e sottotitoli? –

risposta

14

che dire:?

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, rimane il problema Any. Almeno questo è dovuto al tipo di ritorno di productIterator.

+2

Non ho idea, ma per qualche ragione guardo di nuovo post intenzionalmente dopo mesi e ho notato che il tuo modo di risolvere il problema correttamente. Immagino che quando scrivi una risposta non riesco a ottenere ciò a cui si riferisce il Prodotto. Ora ha senso. Thx Peter :) – Echo

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

ciao, ma questa metodologia non sarà generica. C'è comunque modo di scorrere su ogni variabile della tupla !! Ad esempio ((1,2), (("A", "B"), ("C", 3)), 4) ==> Risultato richiesto: 1, 2, "A", "B", " c ", ... 4 – Echo

+0

È possibile modificare il caso come si desidera. Ad esempio: caso (a: Tuple2 [_, _], b: Tuple2 [_, _]) => fai qualcosa con a e b. Puoi anche abbinare Tuple con tipi specifici. –

+0

Thx alot Tustem – Echo

2

Invece di tuple, utilizzare le strutture di dati Shapeless come HList. È possibile avere un'elaborazione generica e inoltre non perdere le informazioni sul tipo.

L'unico problema è che la documentazione non è completa.

0

Questo funziona per me. tranform è una tupla costituita da dataframes

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