comparacion de un string con char en java

Iniciado por sauce19, 21 Agosto 2011, 00:31 AM

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

sauce19

hola!!! m mandaron a realizar un programa usando los cuatro pilares de java, es realizar un menu con los requisitos para crearte un correo electronico, en un solo metodo tngo q pedir nombre,apellido,id,dominio,sexo,contraseña y q m confirmen la contraseña; pero tngo q mostrar todo eso en un solo vector, he hecho casi todo menos lo del sexo, xq m mandaron a contar el numero de usuarios femeninos y masculinos y m da error lo q he hecho para hacer la comparacion y contar, esto es lo q tngo:
Código (java) [Seleccionar]
public static void ingreso () throws IOException{
BufferedReader en= new BufferedReader( new InputStreamReader (System.in));
String vec [];
vec=new String[6];
System.out.println("Ingrese sexo (M)/(F):\n");
System.out.flush();
vec[4]=en.readLine();
System.out.println("\n");}


yo habia hecho la comparacion asi, para luego contarlos, el error me dic qq no puedo comparar un string con un char, y d verdad no entiendo como hacerlo:
Código (java) [Seleccionar]
if(vec[4]=='f'){
fe++;}
if (vec[4]=='m'){
ma++;}

si m podrian aclarar la duda se los agradeceria muchisimo. gracias!!!

someRandomCode

Mira, en si a mi se me ocurren soluciones complicadas como en vez de hacer un vector de Strings, hacer un vector de Objects, y que levantes segun el que sea el objeto que corresponda.

Pero eso es overkill y para otas situaciones.

Podrias hacer en vez de eso un :

if (vec[4].equalsIgnoreCase("f")) fe++;
equalsIgnoreCase es un metodo que compara dos strings sin tener en cuenta mayusculas o minusculas, o sea, "f" y "F" son iguales para ese metodo.
vec[4] es un objeto de tipo String. Por lo tanto podes usarlo.
Comparar un String con un caracter, esta mal.
De movida, vec[4] aun si es una sola letra, ya son dos. Eso seria: 'f' y '\0'.
Si quisieras compararlo asi con el == igual podrias, si haces:
[code]
if (vec[4].charAt(0) == 'f' || vec[4].charAt(0) == 'F') fe++;


vec[4] es un string con una representacion con chars, charAt selecciona el caracter en la posicion empezando a contar desde cero, eso te retorna un char, y si los podrias comparar.
Fijate que por las dudas que el tipo haya puesto una F mayuscula, puse el OR ese ahi en el if.

Alternativamente podrias llevar vec[4] todo a mayusculas (.toUpper()) o todo a minusculas (toLower()) y comparar una sola vez.

Espero que te haya servido, si necesitas mas explicacion preguntame pero esto es bastante simple.[/code]

sauce19

ok muchas gracias por aclarar mi duda somerandomcode. Oye, tngo otra, apenas stoy comenzando a programar en java y quisiera preguntar como hago para mostrar en pantalla lo siguiente, q lo tngo almacenado todo en un vector (es del mismo programa q mencione antes): nombre,apellido,id,dominio,sexo,clave y confirmacion de la clave. yo escribi un metodo para c/u y los tngo asi: el nombre en un vec[0], el apellido en un vec[1], el id en un vec[2],el dominio en un vec[3],el sexo en un vec[4],la clave en un vec[5] y la confirmacion de la clave en un vec[6]; como muestro ese vector en pantalla??? lo intente con un stringformat pero m da error, si m podrias aclarar de nuevo la duda t lo agradeceria mucho, gracias!!

someRandomCode

A ver si te entiendo...
Vos lo que queres es que por pantalla aparezca algo como

vec[0] = nombre
vec[1] = apellido
vec[2] = id
vec[3] = dominio
vec[4] = sexo
vec[5] = clave

Si es asi, y lo queres tener contenido en un metodo público podrias hacer algo como esto:

public void mostrarVector(String Vector[]) {
for (int indicador = 0 ; indicador > Vector.length ; indicador++)
System.out.println ("vec[" + indicador + "] = " +Vector[indicador]);
}



Aca te dejo una muestra con main y todo:

public class Main {

    public static void main(String[] args) {

        String vector[] = new String[6];
        vector[0] = "uno";
        vector[1] = "dos";
        vector[2] = "tres";
        vector[3] = "cuatro";
        vector[4] = "cinco";
        vector[5] = "seis";
        imprimir(vector);

    }

    public static void imprimir(String Vector[]) {
        for (int i = 0 ; i<Vector.length ; i++ )
            System.out.println("Vector[" + i +"] = " + Vector[i]);
    }
}


Esta hecho a las apuradas, pero funciona bien.

Gallu

Por costumbre es siempre mejor aplicar el operador de comparación sobre la constante ejm.

Código (java) [Seleccionar]

if ("f".equalsIgnoreCase(vec[4])


en lugar de
Código (java) [Seleccionar]

if (vec[4].equalsIgnoreCase("f")) fe++;


de esta manera si vec[4] es nulo , no tendrás ningún problema.(NullPointer...)

Saludos.
Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.

someRandomCode

Igualmente si el objeto no esta inicializado, van a haber problemas, independientemente de que lado encares la comprobacion, por ejemplo:

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        String vector[];// = new String[6];
        /*vector[0] = "uno";
        vector[1] = "dos";
        vector[2] = "tres";
        vector[3] = "cuatro";
        vector[4] = "cinco";
        vector[5] = "seis";*/
        if ("f".equalsIgnoreCase(vector[1])) System.out.println("El tenia razon");
        //imprimir(vector);
    }

    public static void imprimir(String Vector[]) {
        for (int i = 0 ; i<Vector.length ; i++ )
            System.out.println("Vector[" + i +"] = " + Vector[i]);
    }
}


Escupe que hay un warning, pero cuando le das correr de todas maneras (o ignoras el warning en caso que invoques al compilador directamente), tenes esto en tiempo de ejecucion:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - variable vector might not have been initialized



Moraleja: asegurarse de que los parametros lleguen como esperas que lleguen, y aprender a manejar excepciones, pero esto para un futuro, porque nuestro amigo aca esta empezando por lo que parece.

Gallu

Pues por eso mismo,  desde el principio debe aprender buenos hábitos , con tu ejemplo a mi el copilador directamente no me genera el .class , si inicializo vector como null me da un NullPointerException por que accedemos a un índice inexistente, si inicializo vector a array de 10 pero no hago el new de sus elementos, entonces es cuando la comparación segura tiene sentido.

Código (java) [Seleccionar]

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        String vector[]= new String[10];
        /*vector[0] = "uno";
        vector[1] = "dos";
        vector[2] = "tres";
        vector[3] = "cuatro";
        vector[4] = "cinco";
        vector[5] = "seis";*/
        if ("f".equalsIgnoreCase(vector[0])) System.out.println("El tenia razon");
        //imprimir(vector);
    }

    public static void imprimir(String Vector[]) {
        for (int i = 0 ; i<Vector.length ; i++ )
            System.out.println("Vector[" + i +"] = " + Vector[i]);
    }
}
Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.

someRandomCode

Comparto, pero hay una cosa que te quiero preguntar, porque nunca vi hacer asi como practica recomendada, podrias citarme alguna fuente?
Ya que estamos, uno siempre aprende algo nuevo...
Segun tenia entendido, en estos casos, la comparacion RTL o LTR (right to left o left to right) si uno de los dos da null, ya se tira la excepcion.
Por cierto, tu codigo y el mio cambian en 2 numeros (6 a 10, y vec[1] por vec[0] ) donde el cambio realmente no es relevante, dado que podria bien ser, en cualquiera de los dos casos, que ambos sean (o no)nulos, o uno de los dos lo sea.
O no entendí lo que quisiste decir con el ejemplo..

Gallu

#8
Cita de: someRandomCode en 23 Agosto 2011, 14:51 PM
Comparto, pero hay una cosa que te quiero preguntar, porque nunca vi hacer asi como practica recomendada, podrias citarme alguna fuente?
He buscado en internet y no he encontrado ninguna recomendación de este tipo , yo la uso por que es politica de mi empresa (desde que llevo con ella , 4 años), en proyectos de tamaño medio/grande , estos detalles son los que hacen la diferencia .

Cita de: someRandomCode en 23 Agosto 2011, 14:51 PM
Ya que estamos, uno siempre aprende algo nuevo...
Segun tenia entendido, en estos casos, la comparacion RTL o LTR (right to left o left to right) si uno de los dos da null, ya se tira la excepcion.

Con el método equals no sucede , no es lo mismo
Código (java) [Seleccionar]

   String usuario = "Carlos";
   String user = null;

  if("Mario".equals(user)); ///bla bla bla


que ..
Código (java) [Seleccionar]

   String usuario = "Carlos";
   String user = null;

  //if("Mario".equals(user)); ///bla bla bla

   if(user.equals("Mario")) ;//bla bla bla


En el segundo da NullPointerException,  obvia el detalle de la inicialización explícita a null , te puedes encontrar con un null recuperando un objeto de session por ejemplo, o un parámetro que no se ha pasado al servlet , etc , etc.

Cita de: someRandomCode en 23 Agosto 2011, 14:51 PM
Por cierto, tu codigo y el mio cambian en 2 numeros (6 a 10, y vec[1] por vec[0] ) donde el cambio realmente no es relevante, dado que podria bien ser, en cualquiera de los dos casos, que ambos sean (o no)nulos, o uno de los dos lo sea.
O no entendí lo que quisiste decir con el ejemplo..

los cambios en realidad no tienen importancia , son debido a que estaba trasteando con tu código .


Por cierto he encontrado algún sitio donde se menciona este tema:
http://isagoksu.com/2009/development/java/how-to-avoid-nullpointerexceptions-npe/

en esta página busca
Citar1. NPE on String

y en esta ..
http://en.wikibooks.org/wiki/Java_Programming/Preventing_NullPointerException

esta también
http://www.java-tips.org/java-se-tips/java.lang/a-small-tip-on-string-to-avoid-nullpointerexce.html

En fin , simplemente buscar NullPointerException prevent java y te saldrán algunas  de ellas.
Saludos.
Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.

someRandomCode

Jaja, si, es que no se, pense que me podias ahorrar la busqueda linkeandome a algun lado pertinente.
El comentario fue uno de esos que no se ven a menudo, que tienen implicaciones tecnicas importantes por mas simple que parezca, y por eso me llamo la atención..
De NotNull y Nullable sabia, lo vi en el SL-275.. Assert tambien esta en el manual, aunque se vio poco, los patrones vi algunos ademas del notado, como por ejemplo el patron singleton comprobado..

Estaba buscando mas que una explicacion de safar de los null (usualmente, siempre los controlo antes de que lleguen, y sino reniego un rato hasta encontrarlo) un manual de consejos practicos compiladitos para eso y otas areas..

Gracias por los enlaces, me pongo de paso a buscar tambien otros (ya capaz que esto vale para agregarlo en el tema que esta sticky de JAVA - ¿cuanta gente has visto que empieza y se pierde por NPE y cae a preguntar por el foro -y en el peor de los casos- sin siquiera querer mostrar codigo fuente?)