2011-03-13 155 views
7

我需要實現,需要一個元組,並返回一個Map 例的一般方法:遍歷一個元組

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

我一直在試圖打破這種解析成一個列表:

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

但是這種方式返回List [Any]。

現在我試圖找出如何遍歷以下元組,例如:

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

以循環每個元素1,2,「A」,B」,...等我怎麼會做這種迭代的在元組

+0

我不明白「返回地圖」。你想要的東西就像任何元組和子元組的所有元素的「Seq」? –

回答

14

怎麼樣?

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 

好吧,Any-問題依然存在。至少這是歸因於productIterator的返回類型。

+2

我不知道,但由於某種原因,我幾個月後再故意再看你的帖子,並注意到你的方式確實解決了我的問題。我想,當你發佈你的答案時,我無法得到產品所指的內容。現在它是有道理的。 Thx Peter :) – Echo

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

嗨,但這種方法不會是通用的。無論如何迭代元組的每個變量!例如((1,2),((「A」,「B」),(「C」,3)),4)==>需要的結果:1,2,「A」,「B」 c「,... 4 – Echo

+0

您可以根據需要修改案例。例如: case(a:Tuple2 [_,_],b:Tuple2 [_,_])=>用a和b做某事。 你也可以在特定類型的元組上進行匹配。 –

+0

Thx alot Tustem – Echo

2

而不是元組,使用Shapeless數據結構像HList。您可以進行通用處理,也不會丟失類型信息。

唯一的問題是文檔不是很全面。

0

這適用於我。變換是一個由數據幀組成的元組

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