Ваше решение близко, но вы используете nextLine()
на Сканере, который будет одновременно использовать все данные String.
Я немного изменил ваш код и выдал следующий вывод:
[[B, B, S], [S, B, F], [B, B, F], [3, null, null], [null, null, null]]
Не совсем понятно, что вы пытаетесь сделать, но я думаю, что это должно дать вам несколько идей о том, как это исправить.Я изменил несколько вещей для этого примера:
- определить
Scanner
для использования указанного вами ввода (вместо запроса на него) - переименовать переменную
Scanner
от str
до scanner
;делает остальной код более читабельным - переименовывает
num
переменную в charactersPerLine
, улучшенную читаемость - используйте
scanner.next()
вместо nextLine()
, таким образом вы получите "B", затем" B ", затем" S "и т. д., каждое в виде отдельного строкового значения - добавляет защиту, если сканер пуст, затем извлекается;это, вероятно, то, что вам не нужно сохранять, но я добавил его, чтобы мой пример работал
- в конце вывести весь массив
public static void main(String[] args) {
Scanner scanner = new Scanner("3 B B S S B F B B F 3");
int charactersPerLine = scanner.nextInt();
String[][] dice = new String[5][charactersPerLine];
for (int i = 0; i < 5; i++) {
for (int j = 0; j < charactersPerLine; j++) {
if (!scanner.hasNext()) {
break;
}
dice[i][j] = scanner.next();
}
}
System.out.println(Arrays.deepToString(dice));
}
Обновить : После ввода этого ответа добавлен ввод с разделителями новой строки в OP, но он не меняет поведения.Независимо от того, есть ли новые строки, scanner.next()
все равно вернет следующее значение.Этот ввод - который включает переводы строки - все еще производит то же поведение:
Scanner scanner = new Scanner("3\n" +
"B B S\n" +
"S B F\n" +
"B B F");