Está en la página 1de 4

EJEMPLO DE USO DE HASHMAP EN JAVA

Publicado el Viernes 15 de febrero de 2013 en Java por Ivn Salas

En esta ocasin voy a compartir un ejemplo en el que se ve como utilizar tablas


hash en Java mediante la clase HashMap.
Imaginemos que necesitamos una aplicacin para una tienda mediante la que
queremos almacenar los distintos productos que venderemos y el precio que
tendrn. Y se quiere que tenga las funciones bsicas, introducir un elemento,
modificar su precio, eliminar un producto y mostrar los productos que tenemos
con su precio.
Vamos con la resolucin del ejemplo de HashMap en Java. En primer lugar para
hacerlo sencillo hacemos una aplicacin para consola y con unos pocos
System.out.println y la clase Scanner para leer desde teclado se crea un sencillo
men con las posibles opciones y con un switch se llama a las distintas
funciones para tratar el HashMap.

1 public static void main(String[] args){


2
3
HashMap<String,Float> listaProductos = new HashMap<String,Float>();
4
Scanner sc = new Scanner(System.in);
5
int opcionElegida = 0;
6
float precio;
7
String codigo;
8
9
while (opcionElegida != 5){
1
System.out.println("Introduce el numero de la opcin que quieras:");
0
System.out.println("1.- Introducir producto");
1
System.out.println("2.- Modificar precio");
1
System.out.println("3.- Mostrar todos los productos");
1
System.out.println("4.- Eliminar producto");
2
System.out.println("5.- Salir");
1
opcionElegida = sc.nextInt();
3
1
switch (opcionElegida){
4
case 1:
1
System.out.println("Introduce el cdido del producto:");
5
codigo = sc.next();
1
System.out.println("Introduce el precio del producto:");
6
precio = sc.nextFloat();
1
guardarProducto(codigo, precio, listaProductos);
7
break;
1
case 2:
8
System.out.println("Introduce el cdido del producto del que quieres cambiar el
1 precio:");
9
codigo = sc.next();
2
modificaPrecio(codigo, listaProductos);
0
break;
2
case 3:
1
mostrarProductos(listaProductos);
2
break;
2
case 4:
2
System.out.println("Introduce el cdido del producto que quieres eliminar:");
3
codigo = sc.next();

2
4
2
5
2
6
2
7
2
8
2
9
3
0
3
1
3
2
3
eliminaProducto(codigo, listaProductos);
3
break;
3
case 5:
4
break; // Si la opcion es 5 no se hace nada
3
default:
5
System.out.println("Tienes que introducir una opcin valida");
3
}
6
3
}
7 }
3
8
3
9
4
0
4
1
4
2
4
3
4
4
4
5
4
6

Usamos mtodos estticos para no tener que instanciar ningn objeto y


ahorrarnos llamar a las funciones desde un objeto porque para lo sencillo que es
el ejemplo no tiene sentido crear por ejemplo una clase tienda y ponerle esos
mtodos o por lo menos es tan innecesario como que las operaciones de la
clase Math tampoco fuesen estticas.
Empezamos con la funcin que guarda un nuevo producto, es decir, que aade
un nuevo elemento al HashMap. Primero comprobamos que no halla ningn
elemento con el cdigo introducido y si es as aadimos el elemento con la
funcin HashMap.put(clave,contenido).

1 public static void guardarProducto(String codigo, float precio, HashMap <String,Float>

2
3
4
5
6
7
8

listaProductos){
if (listaProductos.containsKey(codigo)){
System.out.println("No se puede introducir el producto. El cdigo esta repetido.");
}
else{
listaProductos.put(codigo, precio);
}
}

La funcin para modificar un elemento es prcticamente igual que la anterior


pero, la funcin HashMap.put(clave,contenido) en esta ocasin se ejecutara
cuando se encuentre algn elemento con la clave pasada. Como se puede ver
la funcin put(clave,valor) aade un nuevo elemento si la clave no esta repetida
y modifica el elemento con la clave pasada si ya haba un elemento con esa
clave.

1
public static void modificaPrecio(String codigo, HashMap<String,Float> listaProductos){
2
Scanner sc = new Scanner(System.in);
3
if (listaProductos.containsKey(codigo)){
4
System.out.println("Introduce el precio del producto:");
5
listaProductos.put(codigo, sc.nextFloat());
6
}
7
else{
8
System.out.println("No hay ningun producto con ese cdigo.");
9
}
1
}
0

La funcin encargada de mostrar los productos es la que tiene quizs un poco


ms de dificultad a priori porque para recorrer una hashMap no hay ndices
como en los arrays o ArrayList y es necesario usar un iterador para recorrer el
Hashmap.
Vamos a ver las 2 formas de recorrer un Hashmap en Java, usando entrySet() o
usandokeySet().
Con keySet() lo que se obtiene como indica el nombre de la funcin son las
claves y mediante un iterador se recorre la lista de claves. De esta forma si
queremos saber tambin el valor de cada elemento tenemos que usar la
funcin get(clave).

1 public static void mostrarProductos(HashMap<String, Float> listaProductos){


2 String clave;
3 Iterator<String> productos = listaProductos.keySet().iterator();
4 System.out.println("Hay los siguientes productos:");
5 while(productos.hasNext()){
6
clave = productos.next();
7
System.out.println(clave + " - " + listaProductos.get(clave));
8 }
9}

La otra opcin es entrySet() con la que se obtienen los elementos enteros y al


igual que en el caso anterior con un iterador se recorre el hashMap, pero de

esta forma hay que crear una variable de tipo Map.Entry para almacenar el
elemento y con los mtodos getKey() y getValue() de Map.Entry se obtienen los
valores. Nota: Se puede usar un iterador del tipo que vamos a cojer en este
caso Map.Entry de la misma forma que se hizo en el mtodo anterior, o sino
usar un iterador genrico y luego hacer el casting a Map.Entry.

1
public static void mostrarProductos2(HashMap<String, Float> listaProductos){
2
Iterator iterador = listaProductos.entrySet().iterator();
3
//Iterator<Map.Entry<String, Float>> iterador = listaProductos.entrySet().iterator();
4
Map.Entry producto;
5
while (iterador.hasNext()) {
6
producto = (Map.Entry) iterador.next();
7
//producto = iterador.next(); Si se usase tambien la otra linea comentada.
8
System.out.println(producto.getKey() + " - " + producto.getValue());
9
}
1
}
0

Con esta segunda forma es necesario usar una variable Map.Entry y realizar el
import pertinente, pero el resultado es el mismo y el numero de lneas de
cdigo es igual, aunque esta segunda forma supongo que sea ms eficiente
puesto que mientras que en la primera solo obtenemos la clave y luego hay que
buscar el contenido asociado con la funcin get(clave) con esta segunda forma
ya tenemos ambos valores y no hay que realizar esa bsqueda adicional,
aunque quizs la primera forma sea mas sencilla.
Y finalmente la funcin para eliminar un producto, en la que primero
comprobamos que exista un elemento con la clave pasada y si es as se elimina
con la funcin remove(clave).

1 public static void eliminaProducto(String codigo, HashMap<String,Float> listaProductos){


2
if (listaProductos.containsKey(codigo)){
3
listaProductos.remove(codigo);
4
}
5
else{
6
System.out.println("No hay ningun producto con ese cdigo.");
7
}
8 }

También podría gustarte