2011-03-13 95 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))