2D-Array initialisieren

72

Ich versuche, ein 2D-Array zu initialisieren, in dem der Typ jedes Elements char ist . Bisher kann ich dieses Array nur folgendermaßen initialisieren.

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';
}
}

Ich denke, wenn das Array 10 * 10 ist, ist es der triviale Weg. Gibt es eine effiziente Möglichkeit, dies zu tun?

Justin
quelle

Antworten:

27

Wie wäre es mit so etwas:

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

Das folgende vollständige Java-Programm:

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

Ausgänge:

1
2
3
4
5
6
7
8
9

Dies funktioniert, weil die Ziffern in Unicode ab \ u0030 (von denen Sie erhalten '0') aufeinanderfolgend sind .

Der Ausdruck '1' + row * 3 + col(wo Sie variieren rowund colzwischen 0und 2einschließlich) gibt Ihnen einfach einen Charakter von 1bis 9.

Dies gibt Ihnen natürlich nicht den Charakter 10(da dies zwei Zeichen sind), wenn Sie weiter gehen, aber es funktioniert gut für den 3x3-Fall. Sie müssten die Methode zum Generieren des Array-Inhalts an diesem Punkt ändern, z. B.:

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);
paxdiablo
quelle
Vielen Dank! es funktioniert, aber warum funktioniert "(char) ('1' + row * 3 + col)"?
Justin
249

Der kürzere Weg ist wie folgt:

private char[][] table = {{'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}};
Bhesh Gurung
quelle
1
Nein, dieser Weg funktioniert in Eclipse nicht. Es erwärmt Array-Konstanten und kann nur in Initialisierern verwendet werden
Justin
2
Repariert. Es ist in die Deklarationserklärung eingegangen.
Bhesh Gurung
3
NB: Um die Antwort zu vervollständigen, wenn auf Tabelle [i] [j] verwiesen wird: Ich beziehe mich auf die erste Array-Ebene und j auf die zweite Ebene, basierend auf Null. Zum Beispiel in der aktuellen Beispieltabelle [2] [0] auf '7 '
Emmanuel Devaux
Das ist was ich brauche!!
Arsal Imam
Ich würde nach 3 und 6 brechen und es wie eine Matrix aussehen lassen.
Franklin Yu
15

Einfach zu lesen / zu tippen.

  table = new char[][] {
      "0123456789".toCharArray()
    , "abcdefghij".toCharArray()
  };
Ziege
quelle
6

Sie können for-Schleife verwenden, wenn Sie wirklich wollen.

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

oder mach was bhesh gesagt hat.

dchhetri
quelle
Ich denke, es gibt einen Mismatch-Fehler, kann int nicht dem Typ des Char-Arrays zuweisen
Justin
2

Sie können folgen, was paxdiablo (am 12. Dezember) für einen automatisierten, vielseitigeren Ansatz vorgeschlagen hat:

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

In Bezug auf die Effizienz hängt es vom Umfang Ihrer Implementierung ab. Wenn ein 2D-Array einfach auf die Werte 0 bis 9 initialisiert werden soll, ist es viel einfacher, es einfach innerhalb derselben Anweisung wie folgt zu definieren, zu deklarieren und zu initialisieren: private char[][] table = {{'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}};

Wenn Sie den Algorithmus erweitern möchten, ist der vorherige Code effizienter.

nomad.lw
quelle