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, tengo un HashMap que almacena una MAC y un timer: Código: public static HashMap<Long, KeepAliveTimer> kaTimer; La clase KeepAliveTimer es un timer que relaciona ...
  #1 (permalink)  
Antiguo 22/10/2012, 08:49
 
Fecha de Ingreso: marzo-2009
Mensajes: 509
Antigüedad: 15 años, 8 meses
Puntos: 17
problema con HashMap

hola, tengo un HashMap que almacena una MAC y un timer:

Código:
    public static HashMap<Long, KeepAliveTimer> kaTimer;
La clase KeepAliveTimer es un timer que relaciona la MAC con la IP:

Código:
	public KeepAliveTimer(long mac, String ipAddress)
creo 7 elementos del tipo KeepAliveTimer y los inserto en el HashMap:

Código:
    keepAliveTimer keepAlive = new keepAliveTimer(mac, ip); 
    kaTimer.put(mac, keepAlive);
Y finalmente extraigo el objeto KeepAliveTimer del HashMap:

Código:
   KeepAliveTimer keepAlive = kaTimer.get(mac);
   keepAlive.update();
Sin embargo, si de ese elemento KeepAliveTimer extraigo el valor de "ip" siempre obtengo la ip del último elemento que inserté en el Hash en lugar de la "pareja" de la mac.

¿qué estoy haciendo mal?

Gracias!
  #2 (permalink)  
Antiguo 23/10/2012, 02:23
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 6 meses
Puntos: 306
Respuesta: problema con HashMap

Pues o todas las mac las insertas con la misma ip, o estás metiendo siempre la misma mac por lo que en realidad solo tendrás un timer en el map.

En debug mira qué contiene el map.
__________________
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/10/2012, 04:17
 
Fecha de Ingreso: marzo-2009
Mensajes: 509
Antigüedad: 15 años, 8 meses
Puntos: 17
Respuesta: problema con HashMap

Ya lo he probado, y aparentemente está todo bien.

Para simplificarlo todo, he reducido el número de elementos de 7 a 2, y añadido a mi código en la parte de extraer:

Código:
System.out.println("tamaño" + kaTimer.size());
Collection col = kaTimer.values();
	for (Object obj : col) {
		System.out.println("temporizador " + obj);
     }

	System.out.println("La MAC" + String.valueOf(MACAddress));
	keepAliveTimer keepTimer = kaTimer.get(MACAddress);
	System.out.println("y su timer" +keepTimer);
Y lo que me reporta, para el primer elemento:

Código:
 temporizador spb.KeepAliveTimer@105bd58
 temporizador spb.KeepAliveTimer@edf3f6
 La MAC 26954208388119
 y su timer spb.KeepAliveTimer@edf3f6

Y para el segundo:

Código:
 temporizador spb.KeepAliveTimer@105bd58
 temporizador spb.KeepAliveTimer@edf3f6
 La MAC 26954208388118
 y su timer spb.KeepAliveTimer@105bd58
por lo que parece que eso está bien, no??
  #4 (permalink)  
Antiguo 23/10/2012, 07:43
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 6 meses
Puntos: 306
Respuesta: problema con HashMap

Tienes dos objetos distintos con dos mac distintas, por lo que si te aparece la misma ip es que cuando los creas tienen la misma ip.

Revisa cómo obtienes la ip cuando creas el objeto.
__________________
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.
  #5 (permalink)  
Antiguo 23/10/2012, 07:48
 
Fecha de Ingreso: marzo-2009
Mensajes: 509
Antigüedad: 15 años, 8 meses
Puntos: 17
Respuesta: problema con HashMap

He descubierto un poquito más, pero no llego a nada.

He empezado de cero:

Código:
public MyTimer(long mac, String ipAddress){
    this.macAddress = mac;
    this.ip = ipAddress;

    timer = new Timer();

    TimerTask timerTask = new TimerTask() {

        @Override
        public void run() {
            log.info("mac " + String.valueOf(macAddress) + " ip " + ip);

        }
    };

    timer.schedule(timerTask, 30*1000,30*1000);
    log.info("timer created, mac:" String.valueOf(macAddress) + " ip " + ip);
}
Desde otra clase

Código:
MyTimer timer1 = new MyTimer(mac1, ip1);
MyTimer timer2 = new MyTimer(mac2, ip2);
Cuando se crean:

Código:
Oct 23, 2012 1:36:43 PM spb.MyTimer <init>
INFO: timer created, mac: 26954208388119 ip 77.209.184.53
Oct 23, 2012 1:36:43 PM spb.MyTimer <init>
INFO: timer created, mac 26954208388118 ip 178.139.7.27
Cuando se alcanza el timer la cosa falla

Código:
Oct 23, 2012 1:39:13 PM spb.MyTimer$1 run
INFO: mac 26954208388119 ip 178.139.7.27
Oct 23, 2012 1:39:13 PM spb.MyTimer$1 run
INFO: mac 26954208388118 ip 178.139.7.27
También he probado con "MyTimer extends TimerTask" pero nada, que no doy con ello...
  #6 (permalink)  
Antiguo 23/10/2012, 12:20
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 6 meses
Puntos: 306
Respuesta: problema con HashMap

Lo que preguntaste al principio no es lo mismo que lo que preguntas después.

De todas formas, el código que has puesto funciona bien

Código Javascript:
Ver original
  1. public class TimerC {
  2.  
  3.     public static void main(String[] args) {
  4.         MyTimer timer1 = new MyTimer(26954208388119L, "77.209.184.53");
  5.         MyTimer timer2 = new MyTimer(26954208388118L, "178.139.7.27"); 
  6.     }
  7. }
  8.  
  9. class MyTimer{
  10.    
  11.     Long macAddress;
  12.     String ip;
  13.    
  14.     public MyTimer(long mac, String ipAddress){
  15.         this.macAddress = mac;
  16.         this.ip = ipAddress;
  17.  
  18.         Timer timer = new Timer();
  19.         TimerTask timerTask = new TimerTask() {
  20.             @Override
  21.             public void run() {
  22.                 System.out.println("mac " + String.valueOf(macAddress) + " ip " + ip);
  23.             }
  24.         };
  25.  
  26.         timer.schedule(timerTask, 30*1000,30*1000);
  27.         System.out.println("timer created, mac:" + String.valueOf(macAddress) + " ip " + ip);
  28.     }
  29. }

Da como resultado

Cita:
timer created, mac:26954208388119 ip 77.209.184.53
timer created, mac:26954208388118 ip 178.139.7.27
mac 26954208388118 ip 178.139.7.27
mac 26954208388119 ip 77.209.184.53
mac 26954208388119 ip 77.209.184.53
mac 26954208388118 ip 178.139.7.27
mac 26954208388118 ip 178.139.7.27
mac 26954208388119 ip 77.209.184.53
__________________
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 24/10/2012, 00:30
 
Fecha de Ingreso: marzo-2009
Mensajes: 509
Antigüedad: 15 años, 8 meses
Puntos: 17
Respuesta: problema con HashMap

Hola, sí, ya se que no es el mismo error, es que he visto que el error del HashMap no es del Hash sino de la clase KeepAliveTimer (o MyTimer que es la misma), lo puse por intentar ser más clara, y veo que he conseguido lo contrario

Visto que el código te funciona probaré donde está mi error, porque está claro que debe estar en otro sitio.

Gracias!

Etiquetas: clase, hashmap, string
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 08:49.