Autor Tema: Java Comprobar si String está en más de un array problema metro estaciones línea  (Leído 2777 veces)

Sisu

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 2
    • Ver Perfil
Hola buenos días a todos. Os dejo por aquí un problema con el que llevo atascado un par de días sin obtener avances. Es la primera vez que subo algo al foro, si hay algún problema con la manera de subirlo o algo no duden en comentármelo.

Para poneros en situación este es un método de un programa del metro. En este método lo que pretendo es saber en cuantas líneas de metro distintas se encuentra una estación determinada y a su vez cuáles son esas lineas.(Las estaciones de cada línea las tengo metidas en un array).




Código: [Seleccionar]
public int lineas_por_estacion(String estacion) {
int contador =0;

for(int i=0;i<estacionesLinea1.length;i++) {
if(estacion.equalsIgnoreCase(estacionesLinea1[i])) {
contador++;
System.out.print(estacion+" corresponde con la línea 1");
}
}
for(int j=0;j<estacionesLinea2.length;j++) {
if(estacion.equalsIgnoreCase(estacionesLinea2[j])){
contador++;
System.out.print(", 2");
}
}
for(int x=0;x<estacionesLinea3.length;x++) {
if(estacion.equalsIgnoreCase(estacionesLinea3[x])){
contador++;
System.out.print(", 3");
}
}
for(int q=0;q<estacionesLinea4.length;q++) {
if(estacion.equalsIgnoreCase(estacionesLinea4[q])){
contador++;
System.out.print(", 4");
}
}
for(int w=0;w<estacionesLinea5.length;w++) {
if(estacion.equalsIgnoreCase(estacionesLinea5[w])){
contador++;
System.out.print(", 5");
}
}
for(int e=0;e<estacionesLinea6.length;e++) {
if(estacion.equalsIgnoreCase(estacionesLinea6[e])){
contador++;
System.out.print(", 6");
}
}
for(int r=0;r<estacionesLinea7.length;r++) {
if(estacion.equalsIgnoreCase(estacionesLinea7[r])){
contador++;
System.out.print(", 7");
}
}
for(int t=0;t<estacionesLinea8.length;t++) {
if(estacion.equalsIgnoreCase(estacionesLinea8[t])){
contador++;
System.out.print(", 8");
}
}
for(int p=0;p<estacionesLinea9.length;p++) {
if(estacion.equalsIgnoreCase(estacionesLinea9[p])){
contador++;
System.out.print(", 9");
}
}
for(int a=0;a<estacionesLinea10.length;a++) {
if(estacion.equalsIgnoreCase(estacionesLinea10[a])){
contador++;
System.out.print(", 10");
}
}
for(int s=0;s<estacionesLinea11.length;s++) {
if(estacion.equalsIgnoreCase(estacionesLinea11[s])){
contador++;
System.out.print(", 11");
}
}
for(int f=0;f<estacionesLinea12.length;f++) {
if(estacion.equalsIgnoreCase(estacionesLinea12[f])){
contador++;
System.out.print(", 12");
}
}


contador = nLineas;
return nLineas;
}


Gracias de antemano.
Saludos!!
« Última modificación: 25 de Octubre 2020, 18:50 por Alex Rodríguez »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re:Comprobar si un String se encuentra en más de un array
« Respuesta #1 en: 13 de Abril 2020, 23:23 »
Hola.
Pero, parece que tu código sí conseguiría lo que quieres....
...de no ser por esto raro que haces tras los bucles de búsqueda:
Código: [Seleccionar]
contador = nLineas;
return nLineas;

La variable contador donde has estado contando la coincidencias, la machacas con nLineas, que no se lo que tiene porque es una variable que viene "de fuera" de este método.
Y luego lo que retornas es nLineas

Es decir, la variable que has usado para contar coincidencias, machacas su valor y de todos modos luego ni siquiera la retornas.

Parece que lo lógico sería retornar contador directamente, ya que es quién ha contado las coincidencias.
« Última modificación: 13 de Abril 2020, 23:28 por Kabuto »
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re:Comprobar si un String se encuentra en más de un array
« Respuesta #2 en: 14 de Abril 2020, 00:34 »
Por cierto.
Estaba pensando que para el proceso de búsqueda, se podría reducir mucho código si las estaciones estuvieran en una matriz, y no en arrays separados.

Pero claro, no todas las líneas tienen la misma cantidad de estaciones, y por lo tanto no se puede construir una matriz.

Sin embargo, se puede construir algo parecido a una matriz donde no importe si cada línea tiene una cantidad distinta de estaciones.

No se si has trabajado con colecciones de datos dinámicas, como las clases Vector, ArrayList, etc...
Son colecciones de datos similares a los "arrays primitivos", pero no tienen un tamaño determinado, pueden crecer o decrecer según se añaden o eliminan elementos y además tiene todas las ventajas que da ser una clase orientada a objetos: métodos, herencias, etc...

La ideas es crear cada línea usando una de estas clases, por ejemplo Vector que para este caso nos sobra con lo que ofrece.

Una vez creadas las líneas, estos objetos Vector, se pueden a su vez agrupar en un array simple.
De este modo, tenemos algo muy parecido a una matriz.

Esto hace que luego en el método de busca de estaciones, ya no es necesario usar un bucle distinto para cada linea.
Basta con solo dos bucles anidados.

Abajo dejo un código de prueba donde verás que el método de buscar estaciones, queda reducido a muy pocas líneas.
Además, ya puestos a usar la clase Vector, en ese método de búsqueda lo que hago es devolver los nombres de las líneas coincidentes en un objeto Vector.
Así en un solo objeto tenemos los nombres de las líneas y también la cantidad, pues nos basta con consultar la longitud que tiene dicho Vector.

Aquí te dejo el código por si te resulta útil.

Código: [Seleccionar]
public class EstacionesMetro {

static Vector<String>[] estaciones; //Array de objetos Vector

public static void main(String[] args) {

initEstaciones();
Scanner teclado = new Scanner(System.in);

System.out.print("Estación a consultar: ");
String estacion = teclado.nextLine();
teclado.close();

//Recogemos en un Vector las líneas que contienen dicha estacion
Vector<String> lineas = lineas_por_estacion(estacion);

if (lineas.isEmpty())
System.out.println("No se han encontrado lineas para esas estación.");
else {
System.out.println("Hay " + lineas.size() + " líneas que contienen esa estación.");
System.out.print("Las líneas son: ");
for (String lin: lineas)
System.out.print("[ L" + lin + " ] ");
}

}

static Vector<String> lineas_por_estacion(String estacion) {

Vector<String> lineas = new Vector<String>();
for (int i = 0; i < estaciones.length; i++) {
for (int j = 0; j < estaciones[i].size(); j++) {

if (estaciones[i].get(j).equalsIgnoreCase(estacion)) {
lineas.add(Integer.toString(i + 1));
}
}
}

return lineas;

}

static void initEstaciones() {
Vector<String> l1 = new Vector<String>();
l1.add("Hospital de Bellvitge"); l1.add("Bellvitge"); l1.add("Av. Carrilet");
l1.add("Rambla Just Oliveras"); l1.add("Can Serra"); l1.add("Florida");
l1.add("Torrassa"); l1.add("Santa Eulalia"); l1.add("Mercat Nou");
l1.add("Plaça de Sants"); l1.add("Hostafrancs"); l1.add("Espanya");
l1.add("Rocafort"); l1.add("Urgell"); l1.add("Universitat");
l1.add("Catalunya"); l1.add("Urquinaona"); l1.add("Arc de Triomf");
l1.add("Marina"); l1.add("Glories"); l1.add("Clot");
l1.add("Navas"); l1.add("La Sagrera"); l1.add("Fabra i Puig");
l1.add("Sant Andreu"); l1.add("Torras i Bages"); l1.add("Trinitat Vella");
l1.add("Baro de Viver"); l1.add("Santa Coloma"); l1.add("Fondo");
Vector<String> l2 = new Vector<String>();
l2.add("Paral·lel"); l2.add("Sant Antoni"); l2.add("Universitat");
l2.add("Passeig de Gràcia"); l2.add("Tetuan"); l2.add("Monumental");
l2.add("Sagrada Familia"); l2.add("Encants"); l2.add("Clot");
l2.add("Bac de Roda"); l2.add("Sant Marti"); l2.add("La Pau");
l2.add("Verneda"); l2.add("Artigues Sant Adria"); l2.add("Sant Roc");
l2.add("Gorg"); l2.add("Pep Ventura"); l2.add("Badalona Pompeu Fabra");
Vector<String> l3 = new Vector<String>();
l3.add("Zona Universitaria"); l3.add("Palau Reial"); l3.add("Maria Cristina");
l3.add("Les Corts"); l3.add("Plaça del Centre"); l3.add("Sants Estacio");
l3.add("Tarragona"); l3.add("Espanya"); l3.add("Poble Sec");
l3.add("Paral·lel"); l3.add("Drassanes"); l3.add("Liceu");
l3.add("Catalunya"); l3.add("Passeig de Gracia"); l3.add("Diagonal");
l3.add("Fontana"); l3.add("Lesseps"); l3.add("Vallcarca");
l3.add("Penitents"); l3.add("Vall d'Hebron"); l3.add("Montbau");
l3.add("Mundet"); l3.add("Valldaura"); l3.add("Canyelles");
l3.add("Roquetes"); l3.add("Trinitat Nova");
Vector<String> l4 = new Vector<String>();
l4.add("La Pau"); l4.add("Besos"); l4.add("Besos Mar");
l4.add("El Maresme Forum"); l4.add("Selva de Mar"); l4.add("Poblenou");
l4.add("Llacuna"); l4.add("Bogatell"); l4.add("Ciutadella Vila Olimpica");
l4.add("Barceloneta"); l4.add("Jaume I"); l4.add("Urquinaona");
l4.add("Passeig de Gracia"); l4.add("Girona"); l4.add("Verdaguer");
l4.add("Joanic"); l4.add("Alfons X"); l4.add("Guinardo Hospital de Sant Pau");
l4.add("Maragall"); l4.add("Llucmajor"); l4.add("Via Julia");
l4.add("Trinitat Nova");
Vector<String> l5 = new Vector<String>();
l5.add("Cornella Centre"); l5.add("Gavarra"); l5.add("Sant Ildefons");
l5.add("Can Boixeres"); l5.add("Can Vidalet"); l5.add("Pubilla Cases");
l5.add("Collblanc"); l5.add("Badal"); l5.add("Plaça de Sants");
l5.add("Sants Estacio"); l5.add("Entença"); l5.add("Hospital Clinic");
l5.add("Diagonal"); l5.add("Verdaguer"); l5.add("Sagrada Familia");
l5.add("Sant Pau Dos de Maig"); l5.add("Camp de l'Arpa"); l5.add("La Sagrera");
l5.add("Congres"); l5.add("Maragall"); l5.add("Virrei Amat");
l5.add("Vilapicina"); l5.add("Horta"); l5.add("El Carmel");
l5.add("El Coll La Teixonera"); l5.add("Vall d'Hebron");

estaciones = new Vector[5];
estaciones[0] =  l1; //Linea 1 está en posicion 0
estaciones[1] =  l2; //Linea 2 en posicion 1, etc...
estaciones[2] =  l3;
estaciones[3] =  l4;
estaciones[4] =  l5;
}

}

En pantalla tendríamos esto:
Citar
Estación a consultar: Diagonal
Hay 2 líneas que contienen esa estación.
Las líneas son: [ L3 ] [ L5 ]

Pregunta cualquier duda. Un saludo.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Sisu

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 2
    • Ver Perfil
Re:Comprobar si un String se encuentra en más de un array
« Respuesta #3 en: 14 de Abril 2020, 19:49 »
Muchísimas gracias! Tras un par de días atascado por fin he conseguido avances, me ha sido de gran ayuda la verdad. Empecé el otro día a dar los ArrayList, y los Vectores. Los empezaré a usar de ahora en adelante que la verdad que si que son bastante mas prácticos.

Una vez más muchas gracias,

Un saludo!
« Última modificación: 25 de Octubre 2020, 18:49 por Alex Rodríguez »

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".