Проблемы с повторной функцией nextLine - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь использовать введенные пользователем N строк по N символов для выполнения некоторых операций. Но сначала мне нужно знать N и еще один вводимый int. Когда я определяю N и другое целое число K, а затем записываю 5 строк (в данном случае) по 5 символов каждый, программа работает хорошо. Но когда я использую представленную строку a (которую я затем разделил бы на 2 целых числа, N и K, не показанные здесь, чтобы не усложнять вещи), возникает ошибка. Даже если я сейчас ввожу 6 строк по 5 последних из 5 символов в каждой, программа выдает ошибку, так как для мультифункции не найдено ни одной строки. Я не понимаю, в чем проблема, и если я удаляю строку a и просто определяю N и K, программа работает хорошо. Что еще более удивительно, программа запускается, если я использую интерактивную консоль вместо ввода текста и пишу термины один за другим.

static String [][] vetor (int N) {
    Scanner scan = new Scanner(System.in);  
    String[][] multi = new String [N][N];
    for (int i = 0 ; i<N ; i++){
        String forest = scan.nextLine();
        String[] chars = forest.split("");
        for (int k=0; k<N; k++){
            multi[i][k]= chars [k];
        }
    }
    return multi;
    }
   public static void main(String args[]) {
    Scanner scan = new Scanner(System.in);
    String a = scan.nextLine();
    int N = 5;
    int K = 5;
    String [][] multi = vetor(N);

Я пробовал много вещей, но не могу понять это. Я не нашел подобных вопросов, но не стесняйтесь перенаправить меня к объяснению.

Редактировать: аналогичную программу, которую можно запустить (с возможным вводом вниз (K <= N)): </p>

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

public class Main {
    static int[] numerificar() {
    Scanner myObj = new Scanner(System.in);  
    String Input = myObj.nextLine();
    String[] Inputs = Input.split(" ", 0);
    int size = Inputs.length;
      int [] a = new int [size];
      for(int i=0; i<size; i++) {
         a[i] = Integer.parseInt(Inputs[i]);}
    return a;
      
   }
    static String [][] vetor (int N) {
    Scanner scan = new Scanner(System.in);  
    String[][] multi = new String [N][N];
    for (int i = 0 ; i<N ; i++){
        String forest = scan.nextLine();
        String[] chars = forest.split("");
        for (int k=0; k<N; k++){
            multi[i][k]= chars [k];
        }
    }
    return multi;
    }
   public static void main(String args[]) {
    Scanner scan = new Scanner(System.in);
    int[] a = numerificar();
    int N = a[0];
    int K = a[1];
    int cadeira = 0;
    String [][] multi = vetor(N);
    for (int i = 0 ; i<N ; i++){
        if (cadeira == 1) {
                    break;
        }
        for (int k=0; k<N-K+1; k++){
            if (cadeira == 1) {
                    break;
            }else if( multi[i][k].equals(".")){
                for (int j=0; j<K; j++){
                    if(multi[i][k+j].equals( "#")){
                        k+=j;
                        break;
                    } else if (j == K-1) {
                        cadeira = 1;
                    }
                }
            }
        }
    }
    System.out.println(cadeira);
   }
}

5 3
.#.##
#####
##...
###..
#####
В этом случае на выходе должно быть 1.

1 Ответ

1 голос
/ 14 апреля 2020

Проблема в том, что вы создаете более одного Scanner, который читает из System.in. Когда данные доступны, объект Scanner может прочитать больше данных, чем вы запрашиваете у них. Первый сканер в методе numerificar() читает больше, чем первая строка, и эти строки недоступны для второго сканера в методе vetor().

Решение: используйте только один объект сканера в вся программа.

public class Main {
    static Scanner globalScanner = new Scanner(System.in);  

    static int[] numerificar() {
        String Input = globalScanner.nextLine();
        String[] Inputs = Input.split(" ", 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...