Scala 将嵌套产品/元组分配给数组[数值]

Scala 将嵌套产品/元组分配给数组[数值],scala,Scala,我正在寻找一种快速的方法,将产品分配到具有Numeric类型的数组。例如,我想用值填充数组元素: 到目前为止,我的方法是 var i = 0; var itRow = values.productIterator.asInstanceOf[Iterator[Product]] while(itRow.hasNext){ var itCol = itRow.next.productIterator.asInstanceOf[Iterator[Double]] while(i

我正在寻找一种快速的方法,将产品分配到具有Numeric类型的数组。例如,我想用值填充数组元素:

到目前为止,我的方法是

var i = 0;
var itRow = values.productIterator.asInstanceOf[Iterator[Product]]
while(itRow.hasNext){
    var itCol = itRow.next.productIterator.asInstanceOf[Iterator[Double]]
        while(itCol.hasNext){
            elements(i) = itCol.next.asInstanceOf[Double]
            i = i + 1
        }
}
如果值中的所有条目都是双精度的,那么它就可以工作了,但是如果能让它也适用于基本的数值,那就太好了。 第二,有没有更优雅、更快捷的方法?也许最好是将元组展平

def flatProduct(t: Product): Iterator[Any] = t.productIterator.flatMap {
    case p: Product => flatProduct(p)
    case x => Iterator(x)
}  

// edit: I think this is better, 
// but still the problematic if there are Int-types in values
flatProduct(values).asInstanceOf[Iterator[Dobule]].copyToArray(elements)
你觉得怎么样

多谢各位

选择:

scala> values.productIterator.map{case (x: Double, y: Double) => Array(x, y)}.flatten.toList
res17: List[Double] = List(11.0, 12.0, 21.0, 22.0, 31.0, 32.0, 4.0, 1.0)

scala> values.productIterator.asInstanceOf[Iterator[(Double,Double)]].foldLeft(List[Double]()){(l, i) => i._2 :: i._1 :: l}.reverse
res18: List[Double] = List(11.0, 12.0, 21.0, 22.0, 31.0, 32.0, 4.0, 1.0)

scala> values.productIterator.foreach{var i = 0; {case (x: Double, y: Double) => elements(i) = x; elements(i + 1) = y; i += 2}}

scala> elements
res19: Array[Double] = Array(11.0, 12.0, 21.0, 22.0, 31.0, 32.0, 4.0, 1.0)

谢谢你的快速回答!对不起,我的描述不够清楚。问题是,元组不限于4乘2,也不限于Double(但数组是Double)。在这种情况下,flatProduct方法很好。只需在调用后添加
.map(convert).toArray
,其中
convert
是一个函数
Any=>Double
。由于它是一个迭代器,所有操作都在一次过程中完成(转换为数组时)
scala> values.productIterator.map{case (x: Double, y: Double) => Array(x, y)}.flatten.toList
res17: List[Double] = List(11.0, 12.0, 21.0, 22.0, 31.0, 32.0, 4.0, 1.0)

scala> values.productIterator.asInstanceOf[Iterator[(Double,Double)]].foldLeft(List[Double]()){(l, i) => i._2 :: i._1 :: l}.reverse
res18: List[Double] = List(11.0, 12.0, 21.0, 22.0, 31.0, 32.0, 4.0, 1.0)

scala> values.productIterator.foreach{var i = 0; {case (x: Double, y: Double) => elements(i) = x; elements(i + 1) = y; i += 2}}

scala> elements
res19: Array[Double] = Array(11.0, 12.0, 21.0, 22.0, 31.0, 32.0, 4.0, 1.0)