2013-08-04 20 views
4

這段代碼更新2D陣列中的所有元素與一些隨機值的2D陣列的元素,是否有任何另一種簡單和短碼來解決這個問題?大多數優化的方式來更新Scala中

val terrainTypes = TerrainBlockType.values 

(0 until width).foreach(i => { 
    (0 until height).foreach(j => { 
     val r = Random.nextInt(terrainTypes.length) 
     terrainMap(i)(j) = terrainTypes(r) 
    }) 
}) 
+0

是你正在尋找做同樣的事情的更多的CPU高效的方式,或者更短的代碼,做同樣的事情? – Behrang

+0

@BehrangSaeedzadeh他們兩個,但是越短越好 – Pooya

回答

5

如果您想更新一個已經存在的數組:

terrainMap.foreach(_.transform(_ => 
    terrainTypes(Random.nextInt(terrainTypes.length)) 
)) 
8

短代碼與新Array創作:

val terrainMap = 
    Array.tabulate(width, height){ (_, _) => 
    terrainTypes(Random.nextInt(terrainTypes.length)) 
    } 

如果您需要for循環優化看看Scalaxy

for { 
    i <- 0 until width optimized; 
    j <- 0 until height optimized 
} { 
    val r = Random.nextInt(terrainTypes.length) 
    terrainMap(i)(j) = terrainTypes(r) 
} 

Scalaxy使用while循環優化for-comprehensions

+0

謝謝,但我terrainMap是一種價值,我想改變每次的項目,而不是整個地圖 – Pooya

+0

@Pooya:然後,你必須讓性能和簡潔之間做出選擇。簡潔 - [transform](http://stackoverflow.com/a/18042908/406435),性能 - scalaxy。我更喜歡使用像Vector這樣的不可變數據結構。 – senia