2011-03-13 12 views
7

trzeba zaimplementować rodzajowe sposób, że trwa krotki i zwraca mapie Przykład:iteracyjnego krotki

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

Mam stara się przełamać ten krotki do listy:

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

Ale w ten sposób zwraca listę [Any].

Staram się teraz, aby dowiedzieć się w jaki sposób iteracyjne nad poniższej krotki, na przykład:

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

w celu pętli nad każdym elementem 1,2 „A”, B”, ... itp Jak mogłem zrobić tego rodzaju iteracji przez krotki

+0

Nie rozumiem "zwraca mapę". Chcesz coś jak "Seq" wszystkich elementów każdej krotki i subtuples? –

Odpowiedz

14

Co o:

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, the Any -problem pozostaje. Przynajmniej wynika to z typu zwrotu: productIterator.

+2

Nie mam pojęcia, ale z jakiegoś powodu patrzę na ur celowo ponownie po miesiącach i zauważyłem, że ur sposób naprawia mój problem poprawnie. Wydaje mi się, że po wysłaniu odpowiedzi na pytanie nie mogłem uzyskać tego, o czym mówi Produkt. Teraz to ma sens . Thx Peter :) – Echo

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

cześć, ale ta metodologia nie będzie ogólna. Czy mimo to iteracyjne nad każdą zmienną krotki !! Na przykład ((1,2), (("A", "B"), ("C", 3)), 4) ==> Wymagany wynik: 1, 2, "A", "B", " c ", ... 4 – Echo

+0

Możesz zmodyfikować obudowę, jak chcesz. Na przykład: case (a: Tuple2 [_, _], b: Tuple2 [_, _]) => zrób coś za pomocą aib. Możesz także dopasowywać na Krotkach określone typy. –

+0

Thx dużo Tustem – Echo

2

Zamiast krotek należy użyć struktur danych, takich jak HList. Możesz mieć ogólne przetwarzanie, a także nie tracić informacji o typie.

Jedynym problemem jest to, że dokumentacja nie jest bardzo obszerna.

0

To działa dla mnie. tranform jest krotką zawierającą ramki danych

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