Инициализировать 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, это тривиальный путь.
Есть ли эффективный способ сделать это?
Ответы
Ответ 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'}};
Или, если вы планируете расширить алгоритм, предыдущий код окажется более эффективным.