2

(Scala 2.7.7 :) Je ne m'habitue pas aux 2d-Arrays. Les tableaux sont mutables, mais comment puis-je spécifier un 2d-Array qui est - disons de taille 3x4. La dimension (2D) est fixe, mais la taille par dimension doit être initialisable. J'ai essayé ceci:initialisation d'un tableau 2-dim en Scala

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() 
} 

Je reçois cette erreur: : 11: Erreur: mise à jour de la valeur n'est pas membre du Char champ (r) = spl.map (_.charAt (0))

Si ce serait Java, il serait beaucoup plus de code, mais je voudrais savoir comment faire, alors je montre ce que je veux dire:

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")); 
} 
} 

et fraese.fld regarderait, par exemple, comme ça:

M M M 
M . M 

Je reçois quelques pas large avec

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

mais comment pourrais-je alors mettre en œuvre « mettre »? Ou existe-t-il une meilleure façon d'implémenter le 2D-Array. Oui, je pourrais utiliser un un faible Array, et travailler avec

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

mais je préférerais une notation qui ressemble plus 2d-ish.

Répondre

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

Faut-il:

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

... à partir de 0 au lieu de 1?

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

Si cela utiliser la syntaxe de l'opérateur, comme ceci:

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

... sans '' entre spl et carte?


C'est ma version - j'ai remplacé le scanner avec un tableau [chaîne] puisque je ne suis pas vraiment sûr de ce que l'entrée pour le scanner est censé être. Il compile et fonctionne sur 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

- oui, r devrait commencer par zéro. - oui/non - (spl map vs. spl.map) ça ne joue aucun rôle, n'est-ce pas? Mon formateur de n'était pas correct - je l'ai changé maintenant. Votre approche de tableau est correcte pour ce que j'aime faire. Mais maintenant, comment mettre à jour une seule cellule? 'def put (ligne: Int, col: Int, c: Char) = champ (ligne * cols + col) = c' Eh bien - Je dois utiliser la méthode put en conséquence: \t ' def put (ligne: Int, col: Int, c: Char) = (champ (ligne)) (col) = c' et maintenant, tout à coup, ceci: 'def put (ligne: Int, col: Int, c: Char) = field (row) (col) = c' fonctionne aussi. –