2011-03-13 34 views
7

tôi cần phải thực hiện một phương pháp chung chung mà phải mất một tuple và trả về một bản đồ Ví dụ:lặp trên một tuple

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

Tôi đã cố gắng để phá vỡ tuple này vào một danh sách:

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

Nhưng cách này trả về Danh sách [Bất kỳ].

tôi đang cố gắng hiện nay để tìm hiểu làm thế nào để lặp qua các tuple sau, ví dụ:

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

để lặp qua mỗi phần tử 1,2, "A", B", ... vv làm thế nào tôi có thể làm điều này loại lặp qua tuple

+0

Tôi không hiểu "trả về một bản đồ". Bạn muốn một cái gì đó giống như một 'Seq' của tất cả các yếu tố của bất kỳ tuple và subtuples? –

Trả lời

14

gì về:

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, còn lại Any. Ít nhất đó là do loại trả về của productIterator.

+2

Tôi không có ý tưởng nhưng vì một số lý do tôi xem bài viết ur cố ý một lần nữa sau nhiều tháng và nhận thấy rằng cách ur sửa vấn đề của tôi đúng cách. Tôi đoán rằng khi u bài ur trả lời tôi không thể có được những gì sản phẩm đề cập đến. Bây giờ nó có ý nghĩa. Thx Peter :) – Echo

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

hi, nhưng phương pháp này sẽ không chung chung. Có anyway để lặp qua mỗi biến của tuple !! Ví dụ ((1,2), (("A", "B"), ("C", 3)), 4) ==> Kết quả bắt buộc: 1, 2, "A", "B", " c ", ... 4 – Echo

+0

Bạn có thể sửa đổi trường hợp như bạn muốn. Ví dụ: trường hợp (a: Tuple2 [_, _], b: Tuple2 [_, _]) => làm điều gì đó với a và b. Bạn cũng có thể đối sánh trên Tuples với các loại cụ thể. –

+0

Thx alot Tustem – Echo

2

Thay vì bộ dữ liệu, hãy sử dụng Shapeless cấu trúc dữ liệu như HList. Bạn có thể xử lý chung và cũng không mất thông tin loại.

Vấn đề duy nhất là tài liệu không phải là rất toàn diện.

0

Điều này phù hợp với tôi. tranform là một bộ dữ liệu bao gồm các dataframes

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