Java - PROBLEMA CON UN MÉTODO DE ENTRADA PARA UN STRING

 
Vista:
sin imagen de perfil

PROBLEMA CON UN MÉTODO DE ENTRADA PARA UN STRING

Publicado por Fco. Javier (3 intervenciones) el 06/05/2017 18:19:25
Hola a todos. Soy principiante en programación así que puede que este problema no sea muy grave.
Estoy haciendo un ejercicio que me pide crear una pequeña agenda electrónica en Java. El ejercicio está extraido del libro "Aprende a programar con Java" de Paraninfo.

El problema está en que al elegir la opción 1 en el menú (Nuevo contacto). Tengo el siguiente problema:
Sin_t_tulo

Os doy el código fuente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
import java.util.Scanner;
 
/*
 * Diseñar una aplicación que se comporte como una pequeña agenda. Mediante un menú
 * el usuario podrá elegir entre: 
 * 1) añadir un nuevo contacto (nombre y telefono), siempre y cuando la agenda no
 * esté llena 
 * 2) buscar el teléfono de un contacto partiendo de su nombre
 * 3) mostrar la información de todos los contactos ordenados alfabéticamente
 * mediante el nombre
 * En la agenda guardaremos el nombre y el teléfono de un máximo de 20 contactos. 
 */
 
public class Main {
 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
 
		Scanner S = new Scanner(System.in);
		boolean end = false;
		boolean orderList=false;
		int option;
 
		String[] contactName = new String[20];
		int[] contactNumber = new int[20];
		int contactCounter=0;
 
 
		do{
			System.out.println("AGENDA 1.0: ");
			System.out.println("1. Nuevo contacto");
			System.out.println("2. Buscar telefono contacto");
			System.out.println("3. Mostrar contactos alfabéticamente");
			System.out.println("4. Salir");
 
			System.out.print("Elige una opción: ");
			boolean repeatWhile;
			do{
				repeatWhile=false;
				option = S.nextInt();
				if(option<1&&option>4){
					System.out.print("Error, escribe de nuevo: ");
					repeatWhile=true;
				}
			}while(repeatWhile);
 
			switch(option){
				case 1:
					if(contactCounter<20){
						System.out.println("Escribe el nombre del contacto:");
						contactName[contactCounter] = S.nextLine();
 
						do{
							repeatWhile=false;
							System.out.println("Escribe el número del contacto:");
							contactNumber[contactCounter] = S.nextInt();
							if(contactNumber[contactCounter]<0){
								System.out.print("\nERROR: Valor no válido - ");
							}
						}while(repeatWhile);
 
						System.out.println("Se ha guardado el número \""+contactNumber[contactCounter]+"\" para \""+contactName[contactCounter]+"\".");
						contactCounter++;
 
						orderList=true;
					}else{
						System.out.println("ERROR: Hay 20 contactos, no se pueden poner más.");
					}
					break;
				case 2:
					boolean nameFound=false;
					char retry = 0;
					do{
						System.out.println("Escribe el nombre del contacto a buscar: ");
						String nameToFind = S.nextLine();
						int resultCount=1;
 
						System.out.println("Resultados encontrados para \""+nameToFind+"\": ");
						for(int i=0; i<20; i++){
							if(contactName[i]==nameToFind){
								nameFound=true;
								System.out.println("\t"+resultCount+") "+contactNumber[i]);
								resultCount++;
							}
						}
 
						if(!nameFound){
							do{
								repeatWhile=false;
								System.out.println("No se ha encontrado ninguna coincidencia. ¿Reintentar (s/n)?");
								retry = S.nextLine().charAt(0);
								if(retry != 's' && retry != 'n'){
									repeatWhile=true;
									System.out.print("ERROR: Responde correctamente -");
								}
							}while(repeatWhile);
						}
					}while(!nameFound && retry == 's');
					break;
				case 3:
					if(orderList){
						boolean isExchange=true;
						String auxName; int auxNumber;
						while(isExchange){
							isExchange=false;
							for(int i=0; i<20-1; i++){
								if(contactName[i].compareTo(contactName[i+1])>0){
									isExchange=true;
									auxName=contactName[i];
									contactName[i]=contactName[i+1];
									contactName[i+1]=auxName;
 
									auxNumber=contactNumber[i];
									contactNumber[i]=contactNumber[i+1];
									contactNumber[i+1]=auxNumber;
								}
							}
						}
						orderList=false;
					}
 
					System.out.println("LISTA DE CONTACTOS");
					for(int i=0; i<contactCounter; i++){
						System.out.println("\t"+i+") "+contactName[i]+": "+contactNumber[i]);
					}
					break;
				case 4:
					end = true;
					break;
			}
			System.out.println();
		}while(!end);
	}
}


Si os dais cuenta, he escrito el método de entrada nextLine para el String, pero Java le hace el mismo caso que
a una pared o incluso menos:
1
2
3
4
5
6
7
8
9
10
11
System.out.println("Escribe el nombre del contacto:");
						contactName[contactCounter] = S.nextLine();
 
						do{
							repeatWhile=false;
							System.out.println("Escribe el número del contacto:");
							contactNumber[contactCounter] = S.nextInt();
							if(contactNumber[contactCounter]<0){
								System.out.print("\nERROR: Valor no válido - ");
							}
						}while(repeatWhile);

Alguna solución? Gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de kip
Val: 96
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

PROBLEMA CON UN MÉTODO DE ENTRADA PARA UN STRING

Publicado por kip (20 intervenciones) el 06/05/2017 19:13:54
Hola, el problema esta en el metodo que usas del objeto Scanner, especificamente el nextLine(), intenta agregando un nextLine() antes de la linea donde almacenas el nombre:

1
2
3
System.out.println("Escribe el nombre del contacto:");
S.nextLine();
contactName[contactCounter] = S.nextLine();

El problema esta en que nextLine() consume el salto de linea dejado por la instruccion anterior de nextInt() donde tomas la opcion del menu y se almacena como valor, al agregar el nextLine() intermediario este consume el salto de linea y de esa forma la siguiente instruccion se ejecuta normalmente pudiendo tomar el valor que se ingrese.
https://christprogramming.wordpress.com/2014/01/30/java-common-mistakes-1/

Aunque para evitar esto puedes hacer uso de la clase Bufferedreader http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html?is-external=true

Nos cuentas si te sirvio.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

PROBLEMA CON UN MÉTODO DE ENTRADA PARA UN STRING

Publicado por Fco. Javier (3 intervenciones) el 07/05/2017 11:53:18
Hola, muchas gracias por la solución, me funcionó perfectamente con el S.nextLine() adicional. Aunque realmente no lo he intentado usando el Bufferedreader, ya que de momento estoy intentando resolver los ejercicios sin ayuda de los métodos que Java ofrece.

Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar