Инициализация 2-мерного массива в Scala
(Scala 2.7.7:) Я не привыкаю к 2d-массивам. Массивы являются изменяемыми, но как мне указать 2-мерный массив, скажем, размером 3х4. Размер (2D) является фиксированным, но размер для измерения должен быть инициализируемым. Я попробовал это:
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: ошибка: обновление значения не является членом поля Char (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
но я бы предпочел нотацию, которая выглядит более 2D-иш.
1 ответ
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))
... без '.' между сплом и картой?
Это моя версия - я заменил сканер на массив [String], так как я не совсем уверен, каким должен быть вход для сканера. Он компилируется и работает на 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