Java - Ejercicio de parametrización

 
Vista:
Imágen de perfil de jose
Val: 64
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ejercicio de parametrización

Publicado por jose (73 intervenciones) el 04/10/2018 22:52:34
Buenas noches a todos,

Estoy realizando un programa en el que a través de una opción deseada, se llame a un método y esté devuelva los valores de un array. Por desgracia me piden que esté con parámetros de entrada y un return con un array.

Bueno pide más cosas, pero ahora sólo me interesa saber como hacer esto y dónde está el error o como solucionarlo para tener las ideas claras y seguir con el programa del que ahora estoy parado.

Aquí está el menú.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
System.out.println();
 
System.out.println("2. Lista de vehículos de una persona a partir del DNI");
 
 
 
System.out.println("Escribe la opción deseada:");
opcio = scanner.nextInt();
 
switch(opcio){
 
case 2:
    //Lista de vehículos
    opcion2(listaMatriDni);
    break;
...
 default:
    System.out.println("Sólo números entre 1 y 4");
}

Al pulsar a la opción 2, esté va al método opcion2, que busca en un array que tiene matrículas y dnis, que han sido añadidos con por teclado.

1
String[][] listaMatriDni = new String[MAX][2];


1
2
3
4
5
6
7
8
//Lista de vehículos
		private String opcion2(String[][] listaMatriDni) {
			String dni;
			dni = pedirDni();
			String[] arrayConsultaMatriculas = new String[MAX];
			arrayConsultaMatriculas = listaVehiculosByDni(dni, listaMatriDni);
			mostrarListaVehiculos(dni, arrayConsultaMatriculas);
		}

Y este es el módulo que va a buscar para que le pasen la lista de matrículas y que tengan un mismo dni
listaMatriDni[matricula][Dni]

1
2
3
4
5
6
7
8
9
10
11
12
private String listaVehiculosByDni(String vDni, String[][] listaMatriDni) {
			String[] listadoMatriculasPorDni;
			for (int i=0; i < indexMatricula; i++) {
				if (listaMatriDni[i][1].equalsIgnoreCase(vDni)) {
					listadoMatriculasPorDni[i]=listaMatriDni[i][0];
					return listadoMatriculasPorDni[i];
				}
 
			}
			return vDni;
 
		}

Sinceramente no sé lo que estoy haciendo, y me está costando mucho salir de aquí.

Espero que alguién me pudiera echar una mano o algún cirujano que me inserte una sd con todo el código java en el cogote.

Muchas 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 Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ejercicio de parametrización

Publicado por Kabuto (1381 intervenciones) el 05/10/2018 01:10:05
Hola compi.

Mira, este metodo esta mal, por varias razones:

1
2
3
4
5
6
7
8
9
10
11
12
private String listaVehiculosByDni(String vDni, String[][] listaMatriDni) {
    String[] listadoMatriculasPorDni;
    for (int j=0; j < indexMatricula; j++) {
        if (listaMatriDni[j][1].equalsIgnoreCase(vDni)) {
            listadoMatriculasPorDni[j]=listaMatriDni[j][0];
            return listadoMatriculasPorDni[j];
        }
 
    }
    return vDni;
 
}

Declaras un array llamado listadoMatriculasPorDni, pero no lo inicializas para que sepa que dimension va a tener.
En realidad, tampoco sabes que dimension va a tener porque no sabes cuantas matriculas vas a encontrar correspondientes a ese dni: 3, 4,..1... incluso puede que 0
Puedes ponerle tamaño de MAX y asi no te quedas corto:
1
String[] listadoMatriculasPorDni = new String [MAX];

Es una opcion válida, pero no mola mucho porque MAX puede ser valor 10, pero a lo mejor en ese array solo metes un par de matriculas, o una, o ninguna...
Hay un truquito para conseguir construir un array ajustado al tamaño necesario, pero luego lo vemos. Antes quiero mencionar los otros errores de este método.

Dentro del bucle, haces esto:
1
2
3
4
if (listaMatriDni[j][1].equalsIgnoreCase(vDni)) {
    listadoMatriculasPorDni[j]=listaMatriDni[j][0];
    return listadoMatriculasPorDni[j];
}

Si encuentras una matricula coincidente, la añades al array y ¡¡haces un return de ese elemento del array!!
Ese return pondría fin al bucle y al método de forma brupta, no seguiría buscando más matriculas.


Y además, si quieres que este método devuelva un array de String, la firma ha de ser esta:
1
private String[] listaVehiculosByDni(String vDni, String[][] listaMatriDni)
Ahora el compilador si estará de acuerdo en que retornemos un array de String.
Solo que el return del array, hay que hacerlo cuando el bucle for haya terminado de buscar matriculas

1
2
3
4
5
6
7
8
9
10
11
private String[] listaVehiculosByDni(String vDni, String[][] listaMatriDni) {
    String[] listadoMatriculasPorDni = new String[MAX];
    for (int j=0; j < indexMatricula; j++) {
        if (listaMatriDni[j][1].equalsIgnoreCase(vDni)) {
            listadoMatriculasPorDni[j]=listaMatriDni[j][0];
        }
 
    }
    return listadoMatriculasPorDni;
 
}

Pero seguimos teniendo dos problemitas.
Uno, el que dije antes, estamos construyendo un array más grande de lo que posiblemente necesitamos.
Dos, al meter valores en el nuevo array, estamos usando el indice i que es el que recorre la matriz de matriculas, así que las matriculas que estamos obteniendo es muy posible que no se coloquen unas seguidas de otras y empezando desde la posicion 0, ya que a lo mejor encontramos una matricula coincidente con el dni cuando la i en la matriz vale 2 y otra cuando vale 8.

Así que podríamos obtener un array con la lista de matriculas similar a esto:
{null, null, 333MAT, null, null, null, null, null, 444MAT, null}

Para solo dos matriculas, tendríamos un array de longitud 10, y con nuestras dos matriculas esparcidas entre un montón de null.

Por suerte, estos dos problemitas, los podemos resolver con el truquito que mencioné antes.

Lo que haremos es que las matriculas coincidentes que vayamos encontrando, en lugar de meterlas en el array, las iremos concatenando en un String, todas juntas una detrás de otra, pero SEPARADAS por algún tipo de símbolo, por ejemplo, un doble subrayado: __
(conviene evitar simbolos llamados "meta-caracteres" por ejemplo, el asterisco: *)

Una vez finalizado el for, tendremos un String similar a este:
333MAT__444MAT__

Pues, mira tu que bien, la clase String nos proporciona un metodo, llamado split(), que nos permite trocear este String, y con sus trocitos, automáticamente nos construye un array. Tan solo hay que indicarle por donde queremos que vaya haciendo "cortes", es decir, le diremos que vaya dando tajos ahí donde encuentre un doble subrayado.

Una vez recogido el array que nos propociona el split(), simplemente hay que retornarlo:
1
2
3
4
5
6
7
8
9
10
11
12
private String[] listaVehiculosByDni(String vDni, String[][] listaMatriDni) {
    String listaMatris = "";//Inicializamos con cadena vacia
    for (int j=0; j < indexMatricula; j++) {
        if (listaMatriDni[j][1].equalsIgnoreCase(vDni)) {
            listaMatris = listaMatris + listaMatriDni[j][0] + "__";//Concatenamos matricula encontrada con un simbolo para separar
        }
    }
    //Ya hemos buscado matriculas, vamos a convertir el String con el listado de matriculas
    // en un array, usando el metodo .split() de la clase String
    String[] listadoMatriculasPorDni = listaMatris.split("__");
    return listadoMatriculasPorDni;
}

Bien, ya tenemos un metodo que al propocionarle un String con el dni y un mariz con el listado de matriculas y dni, nos devuelve un array con las matriculas.
Y este array, tiene el tamaño necesario para albergar las matriculas que hayamos encontrado, ni más ni menos.

Ahora vamos a ver el metodo opcion2(), que puede hacer con este array.

Lo primero es que en principio, opcion2(), será de tipo void. No tiene por que devolver nada, tan solo pedir un dni al usuario, llamar a nuestro metodo para que busque matriculas y las devuelva en un array.
Recogemos ese array, y podemos por ejemplo mostrar en pantalla las matriculas que contiene:

1
2
3
4
5
6
7
8
9
10
private void opcion2(String[][] listaMatriDni) {
    String dni;
    dni = pedirDni();
            //Tenemos un dni, pedimos un array con las matriculas asociadas a este dni
    String[] arrayConsultaMatriculas = listaVehiculosByDni(dni, listaMatriDni);
    //Mostramos la matriculas obtenidas
    System.out.println("\nMatriculas asociadas al DNI: " + dni);
    for (int j = 0; j < arrayConsultaMatriculas.length; j++)
        System.out.print(arrayConsultaMatriculas[j] + "\t");
}


Y creo que con esto ya está.
Revisalo, compruébalo, pregunta si algo no entiendes... y sobre todo, presta atención a los errores que habías cometido para así aprender de ellos.
Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de jose
Val: 64
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ejercicio de parametrización

Publicado por jose (73 intervenciones) el 05/10/2018 09:55:03
Hola Kabuto,

Sinceramente no se como agradecerte el esfuerzo que haces al explicar el código. Muchas gracias de antemano.

Voy a probar lo que me dices y a continuar con el resto del código, que con toda la formación que me has dado creo que podré hacer el resto.

Muchisimas gracias,
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