2

(Scala 2.7.7 :)我不習慣2d數組。數組是可變的,但是如何指定一個2d數組,比如說3x4的大小。尺寸(2D)是固定的,但每個尺寸的尺寸應可初始化。我嘗試這樣做:初始化Scala中的2-dim數組

class Field (val rows: Int, val cols: Int, sc: java.util.Scanner) { 
var field = new Array [Char](rows)(cols) 

for (r <- (1 to rows)) { 
    val line = sc.nextLine() 
    val spl = line.split (" ") 
    field (r) = spl.map (_.charAt (0)) 
} 

    def put (row: Int, col: Int, c: Char) = 
     todo() 
} 

我得到這個錯誤: :11:錯誤:值更新不是字符 字段(R)= spl.map(_.charAt(0))

的成員

如果這將是Java的,這將是太多的代碼,但我想知道如何做到這一點,所以我說明我的意思:

public class Field 
{ 
private char[][] field; 

public Field (int rows, int cols, java.util.Scanner sc) 
{ 
    field = new char [rows][cols]; 
    for (int r = 0; r < rows; ++r) 
    { 
    String line = sc.nextLine(); 
    String[] spl = line.split (" "); 
    for (int c = 0; c < cols; ++c) 
    field [r][c] = spl[c].charAt (0); 
    } 
} 

public static void main (String args[]) 
{ 
    new Field (3, 4, new java.util.Scanner ("fraese.fld")); 
} 
} 

和fraese.fld會看,例如,這樣的:

M M M 
M . M 

我得到了一些步驟與廣

val field = new Array [Array [Char]](rows) 

,但我怎麼會那麼實行「放」?或者有更好的方法來實現2D陣列。是的,我可以用一個調光陣,並與

put (y, x, c) = field (y * width + x) = c 

工作,但我寧願一個符號,看起來更加二維十歲上下。

回答

2
for (r <- (1 to rows)) { 

如果這是:

for (r <- (0 to rows - 1)) { 

...從0而不是1開始?

field (r) = spl.map (_.charAt (0)) 

如果這種使用操作符語法,就像這樣:

field (r) = spl map (_.charAt (0)) 

...沒有 ''在spl和map之間?


這是我的版本 - 我取代了掃描儀與數組[字符串],因爲我真的不知道什麼掃描儀的輸入應該是。它編譯並運行在Scala 2.7.5上:

class Field (val rows: Int, val cols: Int, lines: Array[String]) { 
    var field = new Array [Array[Char]](rows) 

    // These get replaced later on, but this is how to initialize a 2D array. 
    for (i <- (0 to rows - 1)) { 
     field(i) = new Array[Char](cols) 
    } 

    for (r <- (0 to rows - 1)) { 
     val line = lines(r) 
     val spl = line.split (" ") 
     field(r) = spl map (_.charAt (0)) 
    } 
} 

var lines = Array[String] ("A A A A A", "B B B B B", "C C C C C", "D D D D D", "E E E E E") 
var test = new Field(5, 5, lines) 
test.field 
+0

- 是的,r應該從零開始。 - yes/no - (spl map vs. spl.map)它不起作用,是嗎? 我的格式化不正確 - 現在我改變了它。您的陣列方法對於我喜歡做的事情是正確的。但現在如何更新單個單元? (行:Int,col:Int,c:Char)=字段(行* cols + col)= c' 呃 - 我必須相應地使用put方法:\t 'def put(row: Int,col:Int,c:Char)=(field(row))(col)= c' 現在,突然間,這個:'def put(row:Int,col:Int,c:Char) =字段(行)(col)= c'也起作用。 – 2010-05-01 21:01:40