Foros del Web » Programación para mayores de 30 ;) » Java »

Problema con hashmap

Estas en el tema de Problema con hashmap en el foro de Java en Foros del Web. Hola. Pues tengo un hashmap, que le creo así: Código HTML: HashMap <Object, Object> matriculas =new HashMap <Object, Object> (); Meto datos en el hashmap ...
  #1 (permalink)  
Antiguo 22/06/2011, 16:09
 
Fecha de Ingreso: marzo-2008
Mensajes: 197
Antigüedad: 16 años, 2 meses
Puntos: 3
Problema con hashmap

Hola.
Pues tengo un hashmap, que le creo así:
Código HTML:
HashMap<Object, Object>  matriculas =new HashMap<Object, Object>();
Meto datos en el hashmap aí:
Código HTML:
MatriculaCoche mc1=new MatriculaCoche( matProv, matNum, matLet);
    		  Parte p1 = new Parte(cod,des,prec); 
        	  matriculas.put(mc1,p1);
MatriculaCoche y Parte, son objetos creados llamando a otras clase.

Compruebo a ver si se han creado los hashmap bien así:
Código HTML:
if (matriculas.isEmpty()) {
    		  System.out.println("No hay Datos");
    	  }else System.out.println("Sí hay Datos");
Y sí que se crean bien los hashmap!!!

Pero el problema me llega, cuando quiero mostrar todos los datos del hashmap. Ya que como mi hashmap está creado con dos objetos, no sé si es que lo recorro mal o que pasa.
Código HTML:
Set<Object> s = matriculas.keySet();
    	 Iterator<Object> it2 = s.iterator();

    	 while(it2.hasNext()){
    	 MatriculaCoche ma = (MatriculaCoche)it2.next();
    	 System.out.println(ma + " - " + matriculas.get(ma));
Y me da error también para borrar y mostrar uno...pero con solucionar esto, creo yo que ya podré con los demás..

A alguien se le ocurre en qué fallo??
Ya no sé que puede ser...darme ideas
Gracias de antemano
  #2 (permalink)  
Antiguo 23/06/2011, 03:11
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: Problema con hashmap

¿Has pensado que quizás el texto del error indique cuál es el error?
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #3 (permalink)  
Antiguo 23/06/2011, 13:20
 
Fecha de Ingreso: marzo-2008
Mensajes: 197
Antigüedad: 16 años, 2 meses
Puntos: 3
Respuesta: Problema con hashmap

Es que el problema es que no me salta ningun error.
Si no que directamente me dice que no encuenta una matricula, y no la borra, o en evz de listar todos los datos, me muetra una cosa rara asi:
ejercicio2A6.MatriculaCoche@7d8a992f - ejercicio2A6.Parte@45bab50a
ejercicio2A6 es la clase que tiene el main.
MatriculaCoche es la clase que contiene los datos de la matricula.
Y 7d8a992f y 45bab50a son datos que no sé qué es loq ue son...porque yo no meto esos datos.
Alguien tiene alguna idea de el error que puede ser?
Gracias de antemano.
  #4 (permalink)  
Antiguo 23/06/2011, 14:12
 
Fecha de Ingreso: junio-2011
Mensajes: 39
Antigüedad: 12 años, 10 meses
Puntos: 16
Respuesta: Problema con hashmap

PRIMERO:

Tu estas creando el HashMap así:

Código HTML:
HashMap<Object, Object>  matriculas =new HashMap<Object, Object>();
Sin embargo, si ya conoces los tipos de objetos que almacenará porque mejor no los creas asi:

Código HTML:
HashMap<Parte, MatriculaCoche>  matriculas =new HashMap<Parte, MatriculaCoche>();
SEGUNDO:

Cada entrada de un HashMap esta formada por un objeto clave y un objeto valor. Cuando haces esto:

Código HTML:
Set<Object> s = matriculas.keySet();
Iterator<Object> it2 = s.iterator();
estas obteniendo un conjunto (Set) de todos los objetos clave y sobre ese conjunto obtienes un iterador para recorrerlo.

Pero cuando haces esto:

Código HTML:
while(it2.hasNext()){
    	 MatriculaCoche ma = (MatriculaCoche)it2.next();
    	 System.out.println(ma + " - " + matriculas.get(ma));
}
cometes tu primer error, pues en it2 estas almacenado el conjunto de objetos clave (Para tu caso es un conjunto de objetos tipo Parte) y estas intentando obtener un objeto tipo MatriculaCoche a partir de un objeto tipo Parte.

Por lo tanto si lo que quieres es obtener el conjunto de valores y no de claves, tienes que reemplazar el método keySet() por values() del HashMap

TERCERO:

Código HTML:
MatriculaCoche@7d8a992f - ejercicio2A6.Parte@45bab50a
La salida anterior es lo obvio pues le estas diciendo al JVM que te imprima el objeto, el numero despues del @ es el devuelto por el método hashCode() de la clase Object de la cual heredan todos los objetos en Java.

Si quieres que al hacer System.out.println(); puedas ver el contenido del objeto (de sus variables), deberás sobreescribir el método toString() en tu clase.

Un recurso donde puedes las formas de recorrer un HashMap
http://stackoverflow.com/questions/1066589/java-iterate-through-hashmap

Última edición por jeisongutierrez; 23/06/2011 a las 14:32
  #5 (permalink)  
Antiguo 23/06/2011, 15:49
 
Fecha de Ingreso: marzo-2008
Mensajes: 197
Antigüedad: 16 años, 2 meses
Puntos: 3
Respuesta: Problema con hashmap

Gracias, me ha servido bastante!!
ya he cambiado lo delos objetos del hashmap, pero no me salen los datos totalmente bien. Ya que me salen el hashmap que contiene parte, pero no los de la matricula, y me sale null para la matricula.
He cambiado los toString en cada clase como me comentaste.
Y listar tengo este código:
Código HTML:
Collection<Parte> s = matriculas.values();
    	 Iterator<Parte> it2 = s.iterator();

    	 while(it2.hasNext()){
    	 Parte ma = (Parte)it2.next();
    	 System.out.println(ma + " - " + matriculas.get(ma));
Que como estaba comentando, no muestra la matricula, que es otra clase.

Y con eliminar una matricula y parte del hashmap, tampoco me funciona. Ya que em sigue sin encontrar la matrícula, a pesar de que lo he variado el código:
Código HTML:
MatriculaCoche ma = new MatriculaCoche(provincia,num,letras);
 	       if (this.matriculas.containsKey(ma)==true){
 	    	  this.matriculas.remove(ma);
 	    	   System.out.println("Matricula: "+mat+ " borrada correctamente");
 	       }
 	            else System.out.println("Matricula inexistente");	
Puede alguien ver mi error?
Me pone que la matricula es inexistente,y si, creo una antes, y la pongo bien para eliminar.

Muchas gracias!!!!!!!!!!!!!
  #6 (permalink)  
Antiguo 23/06/2011, 16:00
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: Problema con hashmap

Si tú creas una clase, y quieres comparar un objeto de esa clase con otro objeto de la misma clase para ver si son iguales, necesitas decirle a java como debe compararlos. De lo contrario, aunque tengan el mismo contenido, para java no son iguales, ya que son dos objetos distintos.

Necesitas ver el método equal() y hashcode(), y aprovechando el compareTo() y Comparator.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #7 (permalink)  
Antiguo 23/06/2011, 16:05
 
Fecha de Ingreso: marzo-2008
Mensajes: 197
Antigüedad: 16 años, 2 meses
Puntos: 3
Respuesta: Problema con hashmap

Por eso uso el método: containsKey()
Esto lo he usado en otro hashmap, y me lo ha encontrado bien. La diferencia es que el hashmap estaba creado con una sola clase, y ésta en la que tengo el problema es con dos clase.
gracias!!
  #8 (permalink)  
Antiguo 23/06/2011, 16:08
 
Fecha de Ingreso: junio-2011
Mensajes: 39
Antigüedad: 12 años, 10 meses
Puntos: 16
Respuesta: Problema con hashmap

Cometi un error en mi respuesta pues no me fijé bien en tu código

Te habia aconsejado crear el HashMap asi:
Código HTML:
HashMap<Parte, MatriculaCoche>  matriculas =new HashMap<Parte, MatriculaCoche>();
Pero en realidad es así:

Código HTML:
HashMap<MatriculaCoche,Parte>  matriculas =new HashMap< MatriculaCoche,Parte>();
Tus claves son tipo MatriculaCoche y tus valores tipo Parte.

Ya aclarado eso creo que tu problema esta en entender el funcionamiento de la busqueda dentro del HashMap bien sea con containsKey o con remove, pues hasta donde tengo entendido, estos métodos se basan en el método equals() para hacer la busqueda, por lo tanto tienes que sobreescribir ese método para que tu controles lo que es igual o no.

te recomiendo sobreescribirlo y usar comparaciones por los valores (provincia, num, letras) ademas del operador instanceof.

Busca como sobreescribir equals pues creo que ahi esta tu problema.

Saludos.
__________________
Saludos desde Colombia.
http://labs.distrit.co
  #9 (permalink)  
Antiguo 23/06/2011, 16:13
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: Problema con hashmap

El containsKey() sirve para primitivas y algunas clases de java, pero no para las tuyas.

Si usas como key un integer o una string, claro que funciona.

Tienes que modificar el equals() y el hascode()
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #10 (permalink)  
Antiguo 23/06/2011, 16:18
 
Fecha de Ingreso: marzo-2008
Mensajes: 197
Antigüedad: 16 años, 2 meses
Puntos: 3
Respuesta: Problema con hashmap

Si, si, de ese error ya me dí cuenta..pero no le dí importancia, por eso no lo comenté.
Pero no entiendo lo que me comentas después.
containsKey lo uso para hacer la búsqueda, es decir, como equals, como usted bine comenta.
Pero el remove, es para eliminar el hashmap que hemos encontrado.
Por lo tanto no puedo usar o containsKey o remove..tengo que usar los dos.

No sé si me dices, que yo por ejemplo tengo la variable provincia, en donde tengo la provincia de la matricula, pero no sé como compararlo con ese dato concreto en el hashmap, porque no sé donde se ubica..... Esto creo que no es así...no lo entienod como hacerlo.
Lo que puedo entender a lo que me dice, es al código que tengo ya hecho.

Y Xerelo, le sigo comentando, que si que se puede hacer con hashmap, porque ya lo tengo hecho con otro código. Y me lo hace bien.
No entiendo como hacer de otra manera.. porque con equals, no sé como puedo comparar, como he explicado antes, la provincia que ya tengo que es la que está buscando, con la que está en el hashmap.

Gracias por sus respuestas.
  #11 (permalink)  
Antiguo 23/06/2011, 16:40
 
Fecha de Ingreso: junio-2011
Mensajes: 39
Antigüedad: 12 años, 10 meses
Puntos: 16
Respuesta: Problema con hashmap

Cita:
Iniciado por laOtra Ver Mensaje
Si, si, de ese error ya me dí cuenta..pero no le dí importancia, por eso no lo comenté.
Pero no entiendo lo que me comentas después.
containsKey lo uso para hacer la búsqueda, es decir, como equals, como usted bine comenta.
Pero el remove, es para eliminar el hashmap que hemos encontrado.
Por lo tanto no puedo usar o containsKey o remove..tengo que usar los dos.
No tienes que usar los dos. Estas usando el método remove() del HashMap y no necesitas preguntar si existe para borrarlo, tu código podría quedar así:

Código HTML:
MatriculaCoche ma = new MatriculaCoche(provincia,num,letras);
if (this.matriculas.remove(ma)==null){
    System.out.println("Matricula inexistente")             
}
Lo único que te falta es implementar correctamente los métodos equals() de las clases Parte y MatriculaCoche

Cita:
Iniciado por laOtra Ver Mensaje
No sé si me dices, que yo por ejemplo tengo la variable provincia, en donde tengo la provincia de la matricula, pero no sé como compararlo con ese dato concreto en el hashmap, porque no sé donde se ubica..... Esto creo que no es así...no lo entienod como hacerlo.
Lo que puedo entender a lo que me dice, es al código que tengo ya hecho.
Se trata nuevamente de lo mismo, sobreescribir el método equals() en tus clases clases Parte y MatriculaCoche, esto quiere decir que tienes que crear ese método en tus clases:

Código HTML:
public boolean equals(Object o) {
   if (!(o instanceof Parte))
      return false;
   MatriculaCoche p = (MatriculaCoche) o;
   if(p.provincia == this.provincia && p.num == this.num && p.letras == this.letras)
      return true;   
}
Esto es solo para darte una idea, pues este método depende totalmente de que variables tienen tus clases Parte y MatriculaCoche.
__________________
Saludos desde Colombia.
http://labs.distrit.co
  #12 (permalink)  
Antiguo 23/06/2011, 16:43
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: Problema con hashmap

A ver, lo repito de otra forma, cuando usas una sola clase en un hasmap, significa que para la key estarás usando un integer o un String, en ese caso containskey o remove funcionan, porque java sabe como comparar las keys.

Si usas una clase tuya como key, java no sabe como compararlas, por eso necesitas modificar los dos métodos que te he dicho, para que containskey y remove sepan cómo comparar los objetos. Containskey, get o remove lo que hacen es llamar al método equals()/hascode(), por eso tienes que modificarlos.

Los métodos que se usan para comparar no son los mismos para un Set que para un Hashmap o una lista. Pero en todos ellos necesitas decirle como comparar.

Por otra parte,

Cita:
Set<Object> s = matriculas.keySet();
Iterator<Object> it2 = s.iterator();

while(it2.hasNext()){
MatriculaCoche ma = (MatriculaCoche)it2.next();
System.out.println(ma + " - " + matriculas.get(ma));
No entiendo lo que dices de que no usas HashMap, aquí recuperas un Set de matrículas y le pides al hashmap que te devuelva el objeto al que le has asignado como key cada matrícula. Y como se lo pides a un hashmap, necesitas el equals y el hashcode.

Creo que necesitas olvidar lo que has hecho y que crees que funciona, y centrarte en lo que te estamos diciendo, que es como realmente funcionan las cosas.

No tienes que cambiar código, sólo modificar lo que te hemos dicho.

Edito:

jeisongutierrez

en un hasmap también hay que modificar el hashcode
http://glnconsultora.com/blog/?p=73
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #13 (permalink)  
Antiguo 23/06/2011, 17:24
 
Fecha de Ingreso: marzo-2008
Mensajes: 197
Antigüedad: 16 años, 2 meses
Puntos: 3
Respuesta: Problema con hashmap

Muchas gracias a los dos!!!!!!!
Me funciona ya todo!!!!!!! me crea, me lista, me muestra y me elimina todo correctamente
Aunque hay un pequeño matiz, que no me funciona.. que le he comentado antes.
Y es que al listar, no me muestra los datos de la clase matricula. Me da null.
El código es:
Código HTML:
System.out.println("segunda opcion de listar");
     	 Collection<Parte> s = matriculas.values();
    	 Iterator<Parte> it2 = s.iterator();

    	 while(it2.hasNext()){
    	 Parte ma = (Parte)it2.next();
    	 // 2 lineas nuevas
		  
    	 System.out.println(ma + " - " + matriculas.get(ma));
    	 }
Muchas gracias por toda vuestra ayuda, ya os comprendí a los dos en lo que me comentábais, y era totalmente cierto-
Al final cambié el equals, y también tuve que cambiar el método hashcode.

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:40.