在Scala中創建預填充二維數組的建議方法是什麼?我有以下代碼:在Scala中創建和填充二維數組
val map = for {
x <- (1 to size).toList
} yield for {
y <- (1 to size).toList
} yield (x, y)
如何製作數組而不是列表?用.toArray替換.toList不會編譯。是否有比嵌套的表達式更簡潔或可讀的方式?
在Scala中創建預填充二維數組的建議方法是什麼?我有以下代碼:在Scala中創建和填充二維數組
val map = for {
x <- (1 to size).toList
} yield for {
y <- (1 to size).toList
} yield (x, y)
如何製作數組而不是列表?用.toArray替換.toList不會編譯。是否有比嵌套的表達式更簡潔或可讀的方式?
在斯卡拉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))
在其他方面,你可以使用使用Array.range
和map
:
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,也....)
Array.tabulate似乎甜美,而且看起來像Rex Kerr在另一個答案中提出的Array.fromFunction。有什麼區別(除了我看到Array.fromFunction在2.8中被棄用的事實)?他們如何實際工作? – asteinlein 2010-03-23 18:05:46
@asteinlein我不確定'fromFunction' - 我以前從未注意過它 - 但是'tabulate'(它出現在Scala 2.7上的List中)與您寫的理解非常相似,但是'0直到尺寸'而不是'1到尺寸'。然而,在Scala 2.7中,它只是一維的,所以你需要嵌套它們。在Scala 2.8上,您可以提供多個維度(最多5個,我認爲)。 – 2010-03-24 01:38:13
謝謝。對於任何感興趣的人,這很好地工作在2.7: List.tabulate(3,x => List.tabulate(3,y =>(x,y)).Array).toArray – asteinlein 2010-03-24 18:34:44