2011-05-19 108 views
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) 

你覺得怎麼樣?

非常感謝!

回答

1

供您選擇:

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) 
+0

感謝您的快速答覆!對不起,我的描述不夠清楚。在這種情況下,該元組不限於4×2,並且不限於Double(但是Array是Double) – Markus 2011-05-19 06:43:07

+0

,在這種情況下,您的flatProduct方法是很好的。只需在調用它之後添加'.map(convert).toArray',其中'convert'是一個函數'Any => Double'。由於它是一個迭代器,所有事情都是一次完成的(當轉換爲數組時) – IttayD 2011-05-19 08:54:25