2
我正在尋找一種將產品分配給數字類型爲數組的快速方法。比如我要填補陣列元素與值:將嵌套的產品/元組分配給數組[數字]
// not restricted to be 4-by-2, can be abritary
// Double will be later replaced by type T : Numeric
var elements = new Array[Double](4*2)
// can contain other Numemrics as Int
var values = ((11.0,12.0),(21.0,22.0),(31.0,32.0), (4.0,1.0))
我的做法至今
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
}
}
它的工作原理如果值的所有條目是雙,但它會很高興讓這個工作對於abritary Numerics來說也是如此。第二,是否有更加優雅和快捷的方式來做到這一點?也許這會更好地扁化元組
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)
你覺得怎麼樣?
非常感謝!
感謝您的快速答覆!對不起,我的描述不夠清楚。在這種情況下,該元組不限於4×2,並且不限於Double(但是Array是Double) – Markus 2011-05-19 06:43:07
,在這種情況下,您的flatProduct方法是很好的。只需在調用它之後添加'.map(convert).toArray',其中'convert'是一個函數'Any => Double'。由於它是一個迭代器,所有事情都是一次完成的(當轉換爲數組時) – IttayD 2011-05-19 08:54:25