-1

Необходимо заполнить строковую матрицу данными пользователя. Двумерный массив - обязательное условие. При использовании одного объекта сканера пропускается элемент arr[0][0]. Остальные элементы заполняются корректно. Код:

import java.util.Scanner;
import java.util.Arrays;

public class Solution { public static void main(String[] args) { getTwoDimensionalArray(); }

public static String[][] getTwoDimensionalArray() { System.out.println("Введите количество строк и столбцов таблицы через пробел"); Scanner sc = new Scanner(System.in); String[][] arr = new String[sc.nextInt()][sc.nextInt()]; for (int i = 0; i < arr.length; i++){ for (int j = 0; j < arr[i].length; j++) { if (j % 2 == 0) { System.out.println("Введите ФИО"); arr[i][j] = sc.nextLine(); } else if (j % 2 != 0) { System.out.println("Введите баланс"); arr[i][j] = sc.nextLine(); } } System.out.println(Arrays.toString(arr[i])); } sc.close(); return arr; } }

Вывод:

Введите количество строк и столбцов таблицы через пробел
 3 2
Введите ФИО
Введите баланс
 fgh
[, fgh]
Введите ФИО
 cvb
Введите баланс
 cvb
[cvb, cvb]
Введите ФИО
 cvb
Введите баланс
 cvb
[cvb, cvb]
 12

Но если добавить еще один объект сканера, то все работает как надо:

public static String[][] getTwoDimensionalArray() {
    System.out.println("Введите количество строк и столбцов таблицы через пробел");
    Scanner sc = new Scanner(System.in);
    String[][] arr = new String[sc.nextInt()][sc.nextInt()];
Scanner line = new Scanner(System.in);
for (int i = 0; i &lt; arr.length; i++){
  for (int j = 0; j &lt; arr[i].length; j++) {
    if (j % 2 == 0) {
      System.out.println(&quot;Введите ФИО&quot;);
      arr[i][j] = line.nextLine();
    } else if (j % 2 != 0) {
      System.out.println(&quot;Введите баланс&quot;);
      arr[i][j] = line.nextLine();
    }
  }
  // System.out.println(Arrays.toString(arr[i]));
}
line.close();
sc.close();
System.out.println(Arrays.toString(arr[0]));
System.out.println(Arrays.toString(arr[1]));
System.out.println(Arrays.toString(arr[2]));
return arr;

}

1 Answers1

2

Это достаточно известная проблема, как указано в комментарии с дубликатами.

Она связана с особенностями реализации методов сканнера nextInt/ nextDouble / next, которые оставляют пробельный разделитель, включая символ строки, в потоке.

Но для решения данной проблемы ещё один экземпляр сканера на потоке ввода не нужен, достаточно обработать разделитель -- символ пустой строки, остающийся после sc.nextInt():

String[][] arr = new String[sc.nextInt()][sc.nextInt()];
// пропустить "пустую" строку
if (sc.hasNextLine()) sc.nextLine();

Другой вариант -- одинаково обрабатывать весь ввод, не смешивая nextInt c nextLine, в данном случае, лучше прочитать строку с числами при помощи nextLine, применяя к ней либо отдельный сканер:

System.out.println("Введите количество строк и столбцов таблицы через пробел");
Scanner sc = new Scanner(System.in);
Scanner nums = new Scanner(sc.nextLine());
String[][] arr = new String[nums.nextInt()][nums.nextInt()];

либо String::split + Integer::parseInt:

System.out.println("Введите количество строк и столбцов таблицы через пробел");
Scanner sc = new Scanner(System.in);
String[] nums = sc.nextLine().split("\\s+");
String[][] arr = new String[Integer.parseInt(nums[0])][Integer.parseInt(nums[1])];
Nowhere Man
  • 15,995
  • 33
  • 19
  • 29