Encontrar un String en un Vector de String [JAVA]

Iniciado por Tonyskater, 2 Mayo 2017, 16:43 PM

0 Miembros y 2 Visitantes están viendo este tema.

Tonyskater

Hola compañeros, tengo una duda espero que entre todos podamos resolverla.
Dice así:
tengo un vector de estaciones:
Código (java) [Seleccionar]

       String[] linia = new String[6];
       linia[0] = "La Sagrera";
       linia[1] = "Onze de Setembre";
       linia[2] = "Bon Pastor";
       linia[3] = "Llefiá";
       linia[4] = "La Salut";
       linia[5] = "Gorg";

Se introduce por teclado el nombre de una estación y tengo que averiguar la sucursal que queda más cerca de la estación que he introducido.
Las sucursales están colocadas en los extremos del vector: linia[0] y linia.length-1
Código (java) [Seleccionar]
String sucursal0 = estacion(linia,"La Salut");
System.out.println("La sucursal mas cercana es: "+sucursal0);
String sucursal1 = estacion(linia,"Onze de Setembre");
System.out.println("La sucursal mas cercana es: "+sucursal1);
String sucursal2 = estacion(linia,"Bon Pastor");
System.out.println("La sucursal mas cercana es: "+sucursal2);
String sucursal3 = estacion(linia,"Llefiá");
System.out.println("La sucursal mas cercana es: "+sucursal3);
String sucursal4 = estacion(linia,"La Sagrera");
System.out.println("La sucursal mas cercana es: "+sucursal4);
String sucursal5 = estacion(linia,"Gorg");
System.out.println("La sucursal mas cercana es: "+sucursal5);

Tanto si  el valor introducido no es válido (no se reconoce dentro del vector), o el valor introducido es una de las Sucursales. Se devolverá una cadena vacía.

Si el valor es válido y no es una de las sucursales, se devolverá el nombre de la sucursal más cercana (Aquí esta la parte que no entiendo, ya que me cuesta mucho tratar con vectores de String al no saber comparar bien los elementos entre ellos...)

Cómo podria solucionar el tema de comparar los Strings, la verdad estoy muy verde con ese tema, esta es mi funcion(sin terminar):
Código (java) [Seleccionar]
   public static String estacion(String[] linia, String estacion) {
       String sucursal="";
       for(int i=0;i<linia.length/2;i++){
           if(estacion.equals(linia[i+1])||estacion.equals(linia[i+2])){//esta parte del codigo es muy chapucera, ya que si tuviera un vector mas grande no funcionaria bien con esto...
               sucursal="La Sagrera";
           }else if(estacion.equals(linia.length-1)){
               sucursal="Gorg";
           }else if(estacion.equals(linia[0])){
               sucursal="La Sagrera";
           }else if(){//aqui viene el condicional que necesito
               sucursal="";
           }            
       }
       return sucursal;
   }

Gracias por vuestra ayuda!
Cita de: Manual de mantenimiento de IBM"Todas las piezas deben unirse sin ser forzadas. Debe recordar que los componentes que está reensamblando fueron desmontados por usted, por lo que si no puede unirlos debe existir una razón. Pero sobre todo, no use un martillo"
Mi nombre es Tony y estoy aqui para aprender, pero si hay algo que pueda compartir con vosotros lo haré.

Tonyskater

Con este codigo funciona, pero no es lo que busco, me gustaria hacerlo con un bucle para cualquier tipo de longitud del vector. Este solo funcionaria para este caso.
Código (java) [Seleccionar]
public static String estacion(String[] linia, String estacion) {
        String sucursal="";
            if(estacion.equals(linia[0])||estacion.equals(linia[1])||estacion.equals(linia[2])){
                sucursal="La Sagrera";
            }else if(estacion.equals(linia[3])||estacion.equals(linia[4])||estacion.equals(linia[5])){
                sucursal="Gorg";
            }else{
                sucursal="";
            }           
        return sucursal;
    }
Cita de: Manual de mantenimiento de IBM"Todas las piezas deben unirse sin ser forzadas. Debe recordar que los componentes que está reensamblando fueron desmontados por usted, por lo que si no puede unirlos debe existir una razón. Pero sobre todo, no use un martillo"
Mi nombre es Tony y estoy aqui para aprender, pero si hay algo que pueda compartir con vosotros lo haré.

Tonyskater

Cita de: Tonyskater en  2 Mayo 2017, 17:22 PM
Con este codigo funciona, pero no es lo que busco, me gustaria hacerlo con un bucle para cualquier tipo de longitud del vector. Este solo funcionaria para este caso.
Código (java) [Seleccionar]
public static String estacion(String[] linia, String estacion) {
        String sucursal="";
            if(estacion.equals(linia[0])||estacion.equals(linia[1])||estacion.equals(linia[2])){
                sucursal="La Sagrera";
            }else if(estacion.equals(linia[3])||estacion.equals(linia[4])||estacion.equals(linia[5])){
                sucursal="Gorg";
            }else{
                sucursal="";
            }           
        return sucursal;
    }



Hola lo he entregado así al final, pero me gustaría saber como hacerlo de la otra manera.¿Es muy complicado? He estado mirando por el foro pero no he encontrado gran cosa.
Cita de: Manual de mantenimiento de IBM"Todas las piezas deben unirse sin ser forzadas. Debe recordar que los componentes que está reensamblando fueron desmontados por usted, por lo que si no puede unirlos debe existir una razón. Pero sobre todo, no use un martillo"
Mi nombre es Tony y estoy aqui para aprender, pero si hay algo que pueda compartir con vosotros lo haré.

3n31ch

Hola amigo, lo lamento mucho. No vi tu post hasta ahora.  :-(

Veras, tienes un problema logico grandote ahi. A ti no te interesa saber el nombre de las estaciones que estan en medio. Te interesa saber su indice.

Imaginemos que tienes 6 estaciones:

0 A (SUCURSAL)
1 B
2 C
3 D
4 E
5 F (SUCURSAL)


Los valores "posibles" son 1, 2, 3, 4.

Entonces lo que tienes que ver es si el numero ingresado esta mas cerca del 0 o del 5.

Si te ingresan un 3, sabes que para llegar al 0 hay 3 numeros (que cohincidente mente es igual al numero ingresado... y de hecho si ves con el 2 o con el 1... pasara lo mismo), y para llegar al 5 solo son 2 (que cohincidente mente es el resultado de 5-3).

Luego con un simple if discriminas cual es menor y cual es mayor.

Entonces repasando:
Largo_del_arreglo: 6;
Primera_estacion: 0;
Ultima_estacion: Largo_del_arreglo - 1

Valor_ingresado: 3
Cercania_Primera_estacion: Valor_ingresado;
Cercania_Ultima_estacion: Uiltima_estacion - Valor_ingresado;

SI Cercania_Primera_Estacion < Cercania_Ultima_Estacion:
   IMPRIMIR(Nombre_Primera_Estacion);
O SI NO SE CUMPLIO LA ANTERIOR Y Cercania_Ultima_Estacion < Cercania_Primera_Estacion
   IMPRIMIR(Nombre_Ultima_Estacion);
SI NO SE CUMPLIO NINGUNA DE LAS ANTERIORES
  IMPRIMIR("DA IGUAL, ESTAN IGUAL DE LEJOS, TE JODES");

Tonyskater

#4
Cita de: 3n31ch en  3 Mayo 2017, 12:08 PM
Hola amigo, lo lamento mucho. No vi tu post hasta ahora.  :-(

Veras, tienes un problema logico grandote ahi. A ti no te interesa saber el nombre de las estaciones que estan en medio. Te interesa saber su indice.

Imaginemos que tienes 6 estaciones:

0 A (SUCURSAL)
1 B
2 C
3 D
4 E
5 F (SUCURSAL)


Los valores "posibles" son 1, 2, 3, 4.

Entonces lo que tienes que ver es si el numero ingresado esta mas cerca del 0 o del 5.

Si te ingresan un 3, sabes que para llegar al 0 hay 3 numeros (que cohincidente mente es igual al numero ingresado... y de hecho si ves con el 2 o con el 1... pasara lo mismo), y para llegar al 5 solo son 2 (que cohincidente mente es el resultado de 5-3).

Luego con un simple if discriminas cual es menor y cual es mayor.

Entonces repasando:
Largo_del_arreglo: 6;
Primera_estacion: 0;
Ultima_estacion: Largo_del_arreglo - 1

Valor_ingresado: 3
Cercania_Primera_estacion: Valor_ingresado;
Cercania_Ultima_estacion: Uiltima_estacion - Valor_ingresado;

SI Cercania_Primera_Estacion < Cercania_Ultima_Estacion:
   IMPRIMIR(Nombre_Primera_Estacion);
O SI NO SE CUMPLIO LA ANTERIOR Y Cercania_Ultima_Estacion < Cercania_Primera_Estacion
   IMPRIMIR(Nombre_Ultima_Estacion);
SI NO SE CUMPLIO NINGUNA DE LAS ANTERIORES
  IMPRIMIR("DA IGUAL, ESTAN IGUAL DE LEJOS, TE JODES");


Hola! Gracias por responder! No importa lo que tardes es simplemente que quiero aprender y mejorar lo que ya sé.

Entonces con esto entiendo que, para conocer que recorrido es menor tengo que operar con los valores que ya tengo; 0 y 5(sucursales), 1,2,3 y 4(Estaciones):

Si tengo que llegar a la estación 4 desde una de mis sucursales...

0+valor=Distancia desde 0;
5-valor=Distancia desde 5;
Si distancia desde 0<distancia desde 5{Devolvemos sucursal 0;}
sino si distancia desde 0>distancia desde 5{Devolvemos sucursal 5;}
si no se cumplen ninguna de las 2{Devolveríamos la cadena vacía;}

0+4=4;
5-4=1;
if(4<1){ //devuelve false por lo que no entra en esta condicion
    sout("Estacion 0");
}else if(4>1){
    sout("Estacion 5"); // devuelve true por lo q imprime estacion 5
}else{
   sout(""); // como ah entrado en la condicion anterior ha salido del condicional.
}


Vale, pues muchas gracias!
Hay alguna manera de valorar la contribución de cada usuario en el foro?
En plan darte una puntuación o algo así.
Cita de: Manual de mantenimiento de IBM"Todas las piezas deben unirse sin ser forzadas. Debe recordar que los componentes que está reensamblando fueron desmontados por usted, por lo que si no puede unirlos debe existir una razón. Pero sobre todo, no use un martillo"
Mi nombre es Tony y estoy aqui para aprender, pero si hay algo que pueda compartir con vosotros lo haré.

3n31ch


No creo que nadie de este foro conteste dudas por puntos.  :xD :xD :xD
Con que aprendas y posteriormente tu contestes dudas nos damos por pagados