2010-03-22 127 views
7

在Scala中创建预填充二维数组的建议方法是什么?我有以下代码:在Scala中创建和填充二维数组

val map = for { 
    x <- (1 to size).toList 
} yield for { 
     y <- (1 to size).toList 
    } yield (x, y) 

如何制作数组而不是列表?用.toArray替换.toList不会编译。是否有比嵌套的表达式更简洁或可读的方式?

回答

9

在斯卡拉2.7,使用Array.range

for { 
    x <- Array.range(1, 3) 
} yield for { 
    y <- Array.range(1, 3) 
} yield (x, y) 

在斯卡拉2.8,使用Array.tabulate

Array.tabulate(3,3)((x, y) => (x, y)) 
+0

Array.tabulate似乎甜美,而且看起来像Rex Kerr在另一个答案中提出的Array.fromFunction。有什么区别(除了我看到Array.fromFunction在2.8中被弃用的事实)?他们如何实际工作? – asteinlein 2010-03-23 18:05:46

+0

@asteinlein我不确定'fromFunction' - 我以前从未注意过它 - 但是'tabulate'(它出现在Scala 2.7上的List中)与您写的理解非常相似,但是'0直到尺寸'而不是'1到尺寸'。然而,在Scala 2.7中,它只是一维的,所以你需要嵌套它们。在Scala 2.8上,您可以提供多个维度(最多5个,我认为)。 – 2010-03-24 01:38:13

+0

谢谢。对于任何感兴趣的人,这很好地工作在2.7: List.tabulate(3,x => List.tabulate(3,y =>(x,y)).Array).toArray – asteinlein 2010-03-24 18:34:44

2

在其他方面,你可以使用使用Array.rangemap

scala> Array.range(0,3).map(i => Array.range(0,3).map(j => (i,j))) 
res0: Array[Array[(Int, Int)]] = Array(Array((0,0), (0,1), (0,2)), Array((1,0), (1,1), (1,2)), Array((2,0), (2,1), (2,2))) 

或者你可以使用Array.fromFunction

scala> Array.fromFunction((i,j) => (i,j))(3,3)      
res1: Array[Array[(Int, Int)]] = Array(Array((0,0), (0,1), (0,2)), Array((1,0), (1,1), (1,2)), Array((2,0), (2,1), (2,2))) 

斯卡拉2.8为您提供了更多的选择 - 去翻Array对象。 (其实,这是个好建议为2.7,也....)