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 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");
}
}
}
}
Adjunto | Tamaño |
---|---|
ejercicio3.txt | 1.38 KB |
- Inicie sesión o regístrese para enviar comentarios
<code>
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 siemprefalse
( 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"
Y lo que estás comparando es un "char"
Para entenderlo mejor intenta el siguiente código:
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:
if( telefono.containsKey( c ) ) {
.....
Puntos extra ( no leer hasta haber entendido y probado lo anterior )
1.- Declara el tipo como
Map
en vez deHashMap
( 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.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
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!