web-dev-qa-db-fra.com

Initialiser un tableau 2D

J'essaye d'initialiser un tableau 2D, dans lequel le type de chaque élément est char. Jusqu'à présent, je ne peux initialiser ce tableau que de la manière suivante.

public class ticTacToe 
{
private char[][] table;

public ticTacToe()
{
    table[0][0] = '1';
    table[0][1] = '2';
    table[0][2] = '3';
    table[1][0] = '4';
    table[1][1] = '5';
    table[1][2] = '6';
    table[2][0] = '7';
    table[2][1] = '8';
    table[2][2] = '9';
}
}

Je pense que si le tableau est 10 * 10, c'est une façon triviale. Y a-t-il un moyen efficace de le faire?

63
Justin

Que diriez-vous quelque chose comme ça:

for (int row = 0; row < 3; row ++)
    for (int col = 0; col < 3; col++)
        table[row][col] = (char) ('1' + row * 3 + col);

Le programme complet Java suivant:

class Test {
    public static void main(String[] args) {
        char[][] table = new char[3][3];
        for (int row = 0; row < 3; row ++)
            for (int col = 0; col < 3; col++)
                table[row][col] = (char) ('1' + row * 3 + col);

        for (int row = 0; row < 3; row ++)
            for (int col = 0; col < 3; col++)
                System.out.println (table[row][col]);
    }
}

les sorties:

1
2
3
4
5
6
7
8
9

Cela fonctionne car les chiffres en Unicode sont consécutifs à partir de\u0030 (ce que vous obtenez de '0').

L'expression '1' + row * 3 + col (où vous faites varier row et col entre 0 et 2 inclus) vous donne simplement un caractère de 1 à 9.

Évidemment, cela ne vous donnera pas le caractère 10 (puisque c'est deux caractères) si vous allez plus loin, mais cela fonctionne très bien pour le cas 3x3. Vous devrez changer la méthode de génération du contenu du tableau à ce stade, par exemple avec quelque chose comme:

String[][] table = new String[5][5];
for (int row = 0; row < 5; row ++)
    for (int col = 0; col < 5; col++)
        table[row][col] = String.format("%d", row * 5 + col + 1);
25
paxdiablo

Le plus court est de le faire comme suit:

private char[][] table = {{'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}};
226
Bhesh Gurung

Facile à lire/taper.

  table = new char[][] {
      "0123456789".toCharArray()
    , "abcdefghij".toCharArray()
  };
13
goat

Vous pouvez utiliser la boucle for si vous le souhaitez vraiment.

char table[][] table = new char[row][col];
for(int i = 0; i < row * col ; ++i){
     table[i/row][i % col] = char('a' + (i+1));
}

ou faire ce que bhesh a dit.

5
dchhetri

Vous pouvez suivre ce que paxdiablo (le 12 décembre) a suggéré pour une approche automatisée et plus polyvalente:

for (int row = 0; row < 3; row ++)
for (int col = 0; col < 3; col++)
    table[row][col] = (char) ('1' + row * 3 + col);

En termes d'efficacité, cela dépend de l'ampleur de votre implémentation. S'il s'agit simplement d'initialiser un tableau 2D aux valeurs 0 à 9, il serait beaucoup plus facile de simplement définir, déclarer et initialiser dans la même instruction, comme ceci: private char[][] table = {{'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}};

Ou si vous envisagez d'étendre l'algorithme, le code précédent se révélerait plus efficace.

1
nomad.lw