Подтвердить что ты не робот

Инициализировать 2D-массив

Я пытаюсь инициализировать 2D-массив, в котором тип каждого элемента char. Пока, я могу только инициализировать этот массив следующим образом.

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

Я думаю, что если массив 10 * 10, это тривиальный путь. Есть ли эффективный способ сделать это?

4b9b3361

Ответ 1

Как насчет чего-то вроде этого:

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

Следующая полная программа Java:

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

выходы:

1
2
3
4
5
6
7
8
9

Это работает, потому что цифры в Юникоде начинаются с \u0030 (это то, что вы получаете от '0').

Выражение '1' + row * 3 + col (где вы меняете row и col между 0 и 2 включительно) просто дает вам символ от 1 до 9.

Очевидно, это не даст вам символ 10 (начиная с двух символов), если вы пойдете дальше, но он отлично подходит для случая 3x3. Вам нужно будет изменить способ генерации содержимого массива в этой точке, например, с помощью:

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

Ответ 2

Более короткий способ сделать это следующим образом:

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

Ответ 3

Легко читается/печатается.

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

Ответ 4

Вы можете использовать для цикла, если хотите.

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

или сделайте то, что сказал беш.

Ответ 5

Вы можете следить за тем, что paxdiablo (в декабре '12) предложило использовать автоматизированный и универсальный подход:

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

С точки зрения эффективности, это зависит от масштаба вашей реализации. Если просто инициализировать 2D-массив значениями 0-9, было бы намного проще просто определить, объявить и инициализировать в рамках одного и того же оператора: private char[][] table = {{'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}};

Или, если вы планируете расширить алгоритм, предыдущий код окажется более эффективным.