style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Duda de HashMap?

Hola a todos

Desde hace tiempo estoy tratando de mejorar mi lógica y mejorar mi programación, para eso he estado haciendo ejercicios de este tipo, pero la verdad no sé como manipular los datos de una hashmap para hacer este problema http://www.cstutoringcenter.com/problems/problems.php?id=4, siento que es tan sencillo pero no entiendo como recorrerlo ojala me puedan ayudar, nunca entra al if porque no sé , esto es lo que llevo del código, mi pregunta es como hacer para entrar en la clave del hashmap y luego compararlo con el character??? ojala me puedan ayudar , muchas gracias de antemano

import java.util.*;

public class ejercicio3 {

    public static void main(String args[]) {

        HashMap telefono = new HashMap();

        telefono.put("A", "2");
        telefono.put("B", "2");
        telefono.put("C", "2");
        telefono.put("D", "3");
        telefono.put("E", "3");
        telefono.put("F", "3");
        telefono.put("G", "4");
        telefono.put("H", "4");
        telefono.put("I", "4");
        telefono.put("J", "5");
        telefono.put("K", "5");
        telefono.put("L", "5");
        telefono.put("M", "6");
        telefono.put("N", "6");
        telefono.put("O", "6");
        telefono.put("P", "7");
        telefono.put("R", "7");
        telefono.put("S", "7");
        telefono.put("T", "8");
        telefono.put("U", "8");
        telefono.put("V", "8");
        telefono.put("W", "9");
        telefono.put("X", "9");
        telefono.put("Y", "9");

        String mensaje = "Programming challenges are fun";
        int suma = 0;

       for(int i = 0; i<telefono.size();i++)
       {
           Character letra = mensaje.charAt(i);
           if(telefono.containsKey(letra)){

               suma = Integer.parseInt(telefono.get(i).toString()) + suma;
               System.out.println("Es cierto");

           }else{
               System.out.println("Maldita sea");
           }
       }

    }
}

AdjuntoTamaño
ejercicio3.txt1.38 KB

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

&lt;code&gt;

Tienes que rodear tu código con los tags <code> y </code> para que se vea bien.

Viendo tu anexo... cadena.charAt(x) no te da un Character, te da un char. No es necesario que verifiques si tienes la letra con containsKey, simplemente pide el valor con get(), pero tus llaves son todas mayúsculas, necesitas convertir el caracter a mayúscula y de hecho convertir el caracter a cadena porque las llaves de tu mapa son cadenas.

En vez de charAt() puedes usar substring() y con eso obtienes cadenas aunque sea de un caracter, las conviertes a mayúscula, obtienes el valor correspondiente y ya. Y según el ejercicio, creo que si no tienes valor para el caracter simplemente agregas un espacio.

Gracias lo voy a intentar,

Gracias lo voy a intentar, igual y estaba viendo que nisiquiera entraba en el if y que me regresaba la letra en mayuscula.

gracias

Supongo que te salen muchos

Supongo que te salen muchos Maldita sea

La respuesta rápida es porque  if(telefono.containsKey(letra)) regresa siempre false ( aunque esto ya lo sospechas no? )

La respuesta más larga es: el mapa "telefono" no tiene esa clave por que lo que le pusiste como llave es un "String"

telefono.put("A", "2");//<-- "A" es un String

Y lo que estás comparando es un "char"

Character  letra = mensaje.charAt(i); //<-- letra es un Character  ( que a su vez es un wrapper de char )

Para entenderlo mejor intenta el siguiente código:

class CharVsString {
    public static void main( String [] args ) {
        String mensaje = "Programming";
        Character c = mensaje.charAt( 0 ); //  charAt 0 regresa la letra P

        // el Character 'P' es igual al String "P" ?  -->false
        System.out.println( c.equals("P") );
        //  el Character 'P'  es igual al Character 'P' ? --> true  
        System.out.println( c.equals('P'));

    }
}

O sea que esta comparando peras contra manzanas ( o más bien peras con perones, que aunque se parecen mucho pero no son lo mismo )

El hecho que Java utiliza algo que se llama autoboxing no ayuda mucho a aclarar el problema, pero por el momento olvidemonos de eso.

Ahora hay de dos sopas

1.- O pones caracteres como llaves en el mapa en vez de strings
2.- O sacas strings del mensaje en vez de caracteres

En cualquiera de los dos casos ya vas a poder comparar iguales con iguales, solo ten en cuenta que 'c' es diferente a 'C' ( mayusculas vs. minúsculas ) como ya te dijo Ezamudio

Una ultima cosa

Estas iterando "telefono.size" veces , pero estas sacando los datos de "mensaje" tendría más sentido iterar "mensaje.length" veces no?

Existe en Java una forma de for que te permite iterar cada elemento de un arreglo ( o Iterable para ser más exactos )

Entonces también puees escribir:

for( char c : mensaje.toCharArray() )  {
     if( telefono.containsKey( c ) ) {
       .....

Puntos extra ( no leer hasta haber entendido y probado lo anterior )

1.- Declara el tipo como Map en vez de HashMap ( las razones escapan a este post, pero tu acostumbrate a hacerlo :P )
2.- Puedes almacenar directamente numeros en el mapa, para que al sacarlos no tengas que convertirlos y puedas sumarlos directamente.

Para ello necesitas algo que se llama "generics" y aunque se ve extraño es más fácil de lo que parece

Quedaría así:

        Map<Character, Integer> map = new HashMap<Character, Integer>();// declara un "mapa" de caracteres como llave y enteros como valor
        map.put( 'A', 1); // pone el caracter A con el numero 1
        map.put( 'B', 2);

        String message = "A BA BA A BABA";
        int sum = 0;
        for( char c : message.toCharArray() ) {
                 if( map.containsKey( c  ) ) {
                              sum += map.get( c ); // o sum = sum + map.get( c )
                 }
        }
        System.out.println( sum  ) ; // prints 14 6A's = 6 + 4B's = 8 = 6 + 8 = 14  

Muchas gracias

Hola a todos

Aqui está el codigo gracias todos los que me ayudaron, en un futuro quiero ser un programador competente tal y como ustedes son. Me di cuenta que desde el charray se puede hacer mayusculas así nos causa problemas cuando multiplica, pero el problema esta en que al ser producto int hace overflow, son muchas multiplicaciones, esto me ayudaron a notarlo.

saludos y gracias por su ayuda

import java.util.*;

public class ejercicio3 {

    public static void main(String args[]) {

        Map<Character, Integer> telefono = new HashMap<Character, Integer>();

        telefono.put('A', 2);
        telefono.put('B', 2);
        telefono.put('C', 2);
        telefono.put('D', 3);
        telefono.put('E', 3);
        telefono.put('F', 3);
        telefono.put('G', 4);
        telefono.put('H', 4);
        telefono.put('I', 4);
        telefono.put('J', 5);
        telefono.put('K', 5);
        telefono.put('L', 5);
        telefono.put('M', 6);
        telefono.put('N', 6);
        telefono.put('O', 6);
        telefono.put('P', 7);
        telefono.put('R', 7);
        telefono.put('S', 7);
        telefono.put('T', 8);
        telefono.put('U', 8);
        telefono.put('V', 8);
        telefono.put('W', 9);
        telefono.put('X', 9);
        telefono.put('Y', 9);

        String mensaje = "Programming challenges arefun";
        long producto = 1;

        for (char c : mensaje.toUpperCase().toCharArray()) {

            if (telefono.containsKey(c)) {
                producto = telefono.get(c) * producto;
               
            }
        }

         System.out.println(producto);
    }
}

Llenar una lista desplegable

Hola a todos!
Chicos, soy nueva desarrollando con java y aún más con struts, necesito me ayuden a solucionar este problemilla.
Miren tengo esto en mi DAOJdbc:
//Regreso lista menú por idMenu
public List getMenuById(int idMenu) {
List getId;

String sql= " SELECT id_menu_aplic, descrip, id_menu_aplic_padre " +
"FROM menu_aplic where id_menu_aplic=? ";

System.out.println(sql);
System.out.println("Menu: "+idMenu);

MappingSqlQuery query= new MappingSqlQuery(getDataSource(),sql ){
@Override
protected Object mapRow(ResultSet rs, int i) throws SQLException {
return mapeaGetMenuById(rs,i);
}
};

query.declareParameter(new SqlParameter(Types.INTEGER)); //idMenu
System.out.println("voy a ejecutar ");
getId= query.execute(new Object[]{idMenu});
return getId;
}

private Object mapeaGetMenuById(ResultSet rs, int i) throws SQLException {
MenuTO m=new MenuTO();
m.setIdMenu(rs.getInt("ID_MENU_APLIC"));
m.setDescripcion("DESCRIP");
return m;
}

Y necesito llenar una lista desplegable con esta información que trae este método, la vdd no sé como hacerlo....tmb tengo un action y en casos anteriores he llenado así :
listamenu.put("1","Nuevos");

Ahora necesito llenarla directamente con la info almancenada en la BD para pintarla en mi jsp así:

Alguna idea de esto? La vdd yo no tengo ninguna y por eso recurro a uds. gracias!

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">