Problema com Scanner

6 respostas
Matheus_terra

Pessoal, meu problema é o seguinte: Tenho um algoritmo onde tenho que achar o número de pares que botas de destintos tamanhos e pés formam.

Por exemplo:

40 E
41 D
40 D
41 E

Tenho 4 pés que formam dois pares.

Tenho diversas entradas no programa, e gostaria de saber como sair de um loop quando não tiver mais entradas. Tentei usar o nextLine() do Scanner, ele pega o próximo elemento, repete tudo de novo, mas quando não tem próximo elemento, ele fica pedindo mesmo assim e o programa não sai do loop.

Segue o código:

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {

		Scanner in = new Scanner(System.in);

		int n;
		String nAux = in.next();
		int cont = 0;
		String saida = "";
		boolean acabou = true;

		while (acabou) {
			n = Integer.parseInt(nAux);

			int botasE[] = new int[61];
			int botasD[] = new int[61];

			for (int i = 0; i < n; i++) {

				int m = in.nextInt();
				char c = in.next().charAt(0);

				if (c == 'D')
					botasD[m] += 1;
				else
					botasE[m] += 1;

			}

			for (int j = 30; j <= 60; j++) {
				if (botasD[j] < botasE[j])
					cont += botasD[j];
				else
					cont += botasE[j];
			}
			saida += cont + "\n";

			if (in.nextLine() != null) //Aqui é onde verifico se existe alguma coisa na próxima linha.
                        {
				nAux = in.nextLine();
			} else {
				acabou = false;
			}
			cont = 0;
		}
		System.out.println(saida);
	}
}

6 Respostas

Matheus_terra

Quando eu coloco todos os casos de teste de uma vez só, ele faz tudo mas quando chega no ultimo, entra no if de novo e fica la parado esperando um valor. Ele deveria entrar no else para o ‘acabou’ receber false e sair do loop e encerrar o programa, mas não é isso que está acontecendo. Ele está verificando a próxima linha e ta dizendo que tem valor, mesmo que não tenha.

Os casos de testes são:

4 40 D 41 E 41 D 40 E 6 38 E 38 E 40 D 38 D 40 D 37 E

Esse é um exercicio do spoj: http://br.spoj.com/problems/BOTAS/

douglaskd

seu problema deve estar aqui:

int m = in.nextInt();

troque todos os nextXXX por nextLine() e faça a conversão para o tipo que desejar.

testa o programa e veja o restante dos erros.

Matheus_terra

douglaskd:
seu problema deve estar aqui:

int m = in.nextInt();

troque todos os nextXXX por nextLine() e faça a conversão para o tipo que desejar.

testa o programa e veja o restante dos erros.

Toquei e já deu erro de cara. Usando o nextLine(), não pede pra digitar nada…

douglaskd

Matheus terra:
douglaskd:
seu problema deve estar aqui:

int m = in.nextInt();

troque todos os nextXXX por nextLine() e faça a conversão para o tipo que desejar.

testa o programa e veja o restante dos erros.

Toquei e já deu erro de cara. Usando o nextLine(), não pede pra digitar nada…

Integer m = Integer.parseInt(in.nextLine());

nada ?

Matheus_terra

douglaskd:
Matheus terra:
douglaskd:
seu problema deve estar aqui:

int m = in.nextInt();

troque todos os nextXXX por nextLine() e faça a conversão para o tipo que desejar.

testa o programa e veja o restante dos erros.

Toquei e já deu erro de cara. Usando o nextLine(), não pede pra digitar nada…

Integer m = Integer.parseInt(in.nextLine());

nada ?

O erro em relação ao digitar agora deu certo, mas no final de tudo ta lançando uma exceção dizendo que ta querendo fazer a conversão de “” pra int

WellingtonRamos

Seu if, abaixo, está estranho:

if (in.nextLine() != null) //Aqui é onde verifico se existe alguma coisa na próxima linha. { nAux = in.nextLine(); } else { acabou = false; }
Você não está lendo todas as linhas. Da forma que está, você lê uma não, uma sim.

Outra coisa, quando você diz que ele não sai do loop, o loop fica parado ou o o acabou = false; nunca é atingido mas o loop continua?

Criado 15 de maio de 2013
Ultima resposta 15 de mai. de 2013
Respostas 6
Participantes 3