迭代一个元组

时间:2011-03-13 12:44:34

标签: scala iterator

我需要实现一个带有元组并返回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“,......等。我怎样才能对元组进行这种迭代

4 个答案:

答案 0 :(得分: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的返回类型。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

使用Shapeless数据结构(如HList)代替元组。您可以进行通用处理,也不会丢失类型信息。

唯一的问题是文档不是很全面。

答案 3 :(得分:0)

这对我有用。 tranform是一个由数据帧组成的元组

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