Как читать со стандартного ввода в Java с учетом отсутствия EOF? - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь прочитать этот ввод из командной строки

1 2 3
4 5 6
7 8 9

Но так как он не имеет EOF, программа выдает ошибку времени выполнения. Я читаю это следующим образом внутри al oop:

String holder = scanner.nextLine();

Есть идеи о том, что мне здесь не хватает?

Это код, который я использую

package com.company;
public class Main {

public static void main(String[] args) throws IOException {
    Scanner scanner = new Scanner(System.in);
    int numCases = scanner.nextInt();
    scanner.nextLine();
    for(int i = 0; i < numCases; i++) {
        int matrixSize = scanner.nextInt();
        String ar = scanner.nextLine();
        int matrix[][] = new int[matrixSize][matrixSize];
        String rowNumbers[];
        for(int row = 0; row < matrixSize; row++) {
            String holder = scanner.nextLine();
            rowNumbers = holder.split( " ");
            for(int col = 0; col < matrixSize; col++) {
                matrix[row][col] = Integer.parseInt(rowNumbers[col]);
            }
        }

        int trace = calculateMatrixTrace(matrixSize, matrix);
        int repeatedInRows = countRepeatedInRows(matrixSize, matrix);
        int repeatedInCols = countRepeatedInCols(matrixSize, matrix);

        System.out.println("Case #" + (i + 1) + ":" + " " + trace + " " + repeatedInRows + " " + repeatedInCols);
    }
}

static int calculateMatrixTrace(int matrixSize, int matrix[][]) {
    int matrixTrace = 0;
    for(int i = 0; i < matrixSize; i++) {
        matrixTrace += matrix[i][i];

    }

    return matrixTrace;
}

static int countRepeatedInCols(int matrixSize, int matrix[][]) {
    int repeatedInCols = 0;
    List<Integer> numbersInCols = new ArrayList<>();
    for(int col = 0; col < matrixSize; col++) {
        for(int row = 0; row < matrixSize; row++) {
            int currentNumber = matrix[row][col];
            if (row != 0 && numbersInCols.contains(currentNumber))  {
                repeatedInCols += 1;
                break;
            }
            numbersInCols.add(matrix[row][col]);
        }
        numbersInCols.clear();
    }

    return repeatedInCols;
}

static int countRepeatedInRows(int matrixSize, int matrix[][]) {
    int repeatedInRows = 0;
    List<Integer> numbersInRows = new ArrayList<>();
    for(int row = 0; row < matrixSize; row++) {
        for(int col = 0; col < matrixSize; col++) {
            int currentNumber = matrix[row][col];
            if (col != 0 && numbersInRows.contains(currentNumber))  {
                repeatedInRows += 1;
                break;
            }
            numbersInRows.add(matrix[row][col]);
        }
        numbersInRows.clear();
    }
    return repeatedInRows;
}

}

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

Используйте nextLine() вместо next(), nextInt() et c. Проверьте Сканер пропускает nextLine () после использования next () или nextFoo ()? для получения дополнительной информации.

Сделайте это следующим образом:

import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter the no. of cases: ");
        int numCases = Integer.parseInt(scanner.nextLine());
        for (int i = 0; i < numCases; i++) {
            System.out.print("Enter the size of matrix: ");
            int matrixSize = Integer.parseInt(scanner.nextLine());
            int matrix[][] = new int[matrixSize][matrixSize];
            System.out.println("Enter the matrix: ");
            String rowNumbers[];
            for (int row = 0; row < matrixSize; row++) {
                String holder = scanner.nextLine();
                rowNumbers = holder.split(" ");
                for (int col = 0; col < matrixSize; col++) {
                    matrix[row][col] = Integer.parseInt(rowNumbers[col]);
                }
            }
            System.out.println("matrix[][]: " + Arrays.deepToString(matrix));
        }
    }
}

Пример прогона:

Enter the no. of cases: 1
Enter the size of matrix: 3
Enter the matrix: 
1 2 3
4 5 6
7 8 9
matrix[][]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Не стесняйтесь комментировать в случае каких-либо сомнений / проблем.

0 голосов
/ 04 апреля 2020

Попробуйте что-то вроде этого:

// enter number of lines
int end = scanner.nextInt();
scanner.nextLine(); // clear lingering line delimiter.
for (int i = 0 i < end; i++) {
   String line = scanner.nextLine();
    // rest of your code here.
}

Другой способ - ввести завершающий токен, например, «quit».

for (;;) {
   String line = scanner.nextLine();
   if (line.trim().equalsIgnoreCase("quit") {
      break;
    }
    // rest of your code here.
}

Всегда полезно распечатывать входные приглашения, например, так :

        Scanner scanner = new Scanner(System.in);
        System.out.println("Enter # cases: ");
        int numCases = scanner.nextInt();
        scanner.nextLine();
        for(int i = 0; i < numCases; i++) {
            System.out.print("Enter mat dimension: " );
            int matrixSize = scanner.nextInt();
            String ar = scanner.nextLine(); 
            // rest of code omitted
...