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

[SOLUCIONADO] HashMap - Manejo de colisiones

Estas en el tema de HashMap - Manejo de colisiones en el foro de Java en Foros del Web. Hola chicos! Actualmente estoy programando una tabla hash con la colección de HashMap de Java. La historia es que cuando se general alguna colisión (dos ...
  #1 (permalink)  
Antiguo 30/03/2015, 12:52
 
Fecha de Ingreso: diciembre-2008
Mensajes: 50
Antigüedad: 11 años, 1 mes
Puntos: 0
HashMap - Manejo de colisiones

Hola chicos!

Actualmente estoy programando una tabla hash con la colección de HashMap de Java. La historia es que cuando se general alguna colisión (dos objetos con la misma clave hash) me gustaría obtener todos los objetos implicados en la colisión.

Es decir, si un un momento dado voy a buscar en mi HashMap con la clave "1234" y resulta que hay 5 objetos con esa clave, ¿Puedo obtener los cinco de algún modo?

Muchas gracias!!

PD: La implementación es

Código Java:
Ver original
  1. HashMap<Integer, Cliente> map = new HashMap<Integer, Cliente>();
  2.  
  3. map.put(clave, cliente); //Siendo la clave un int y cliente un objeto de tipo Cliente
  4. map.get(clave); //El problema reside en que este es el único modo que conozco para obtener los objetos
  #2 (permalink)  
Antiguo 30/03/2015, 13:24
 
Fecha de Ingreso: marzo-2015
Mensajes: 45
Antigüedad: 4 años, 10 meses
Puntos: 2
Respuesta: HashMap - Manejo de colisiones

Solo un comentario, que sentido tiene tener un HashMap con claves repetidas, de hecho hasta donde yo tengo entendido, la clave debe ser única ya que es la que te permite acceder al valor, si vas atener varios registros repetidos es mejor trabajar con Listas.

Mira, te pongo una explicación clara de ellos.

http://vayajava.blogspot.com/2008/05/diferencias-entre-las-colecciones-list.html
  #3 (permalink)  
Antiguo 30/03/2015, 15:46
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 10 años, 8 meses
Puntos: 306
Respuesta: HashMap - Manejo de colisiones

Lo que pides es imposible, por definición un HashMap no puede tener key duplicadas.

http://docs.oracle.com/javase/7/docs...tml#put(K,%20V)

Cita:
Associates the specified value with the specified key in this map. If the map previously contained a mapping for the key, the old value is replaced.
Es decir, nunca se considera que que añades una clave duplicada, lo que haces es cambiar el objeto asociado a la clave, y por lo tanto tampoco te dará 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.
  #4 (permalink)  
Antiguo 31/03/2015, 03:56
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 5 años, 5 meses
Puntos: 182
Respuesta: HashMap - Manejo de colisiones

Buenas,

Me uno al clamor popular. Lo que pides es un absurdo....

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #5 (permalink)  
Antiguo 31/03/2015, 05:06
 
Fecha de Ingreso: febrero-2011
Mensajes: 672
Antigüedad: 8 años, 11 meses
Puntos: 78
Respuesta: HashMap - Manejo de colisiones

Ya no hablamos de que no sea lo adecuado utilizar un HashMap, es que directamente en la naturaleza del Map no es posible tener claves duplicadas.

Saludos.
  #6 (permalink)  
Antiguo 01/04/2015, 08:41
 
Fecha de Ingreso: diciembre-2008
Mensajes: 50
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: HashMap - Manejo de colisiones

Comprendo. Entonces, ¿Hay alguna colección que cubra mejor la necesidad? Es decir, si en algún caso se produjese colisión necesito que no se pierdan datos, ¿cómo lo puedo lograr?

Con respecto a lo de las listas que comentó @Lawliet18, el miedo que tengo es que llegado a un número empiece a ser más lento. Estoy aproximando a que el número de elementos sea del orden de 10.000 D:

Muchas gracias :)
  #7 (permalink)  
Antiguo 01/04/2015, 09:24
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 5 años, 5 meses
Puntos: 182
Respuesta: HashMap - Manejo de colisiones

Buenas,

10000 elementos no es nada para una lista hoy en dia. Los puedes recorrer en un bucle en microsegundos.

La coleccion que necesitas es una implementacion de la interfaz List. ArrayList, por ejemplo, te funcionara bien.

Podrias create un pequeno pojo:
HashCliente
--hash
--cliente
gets/sets


Y creas una lista:
List<HashCliente> hashCliente = new ArrayList<>();

Posteriormente para encontrar todas las coincidencias solo tendras que recorrer la lista y retornar una nueva lista con todas las coincidencias encontradas.

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #8 (permalink)  
Antiguo 01/04/2015, 10:58
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.773
Antigüedad: 15 años, 3 meses
Puntos: 454
Respuesta: HashMap - Manejo de colisiones

Hola:

Otra opción es meter una lista como valor en el HashMap algo así

Código Java:
Ver original
  1. HashMap<Integer, List<Cliente>> map = new HashMap<Integer, List<Cliente>>();

Cuando quieras meter un valor tendrías que hacer algo así

Código Java:
Ver original
  1. if (null == map.get(clave)) {
  2.     map.put(clave, new LinkedList<Client>());
  3. }
  4. map.get(clave).add(tuCliente);

básicamente, si al meter un cliente, el valor (la lista) no existe, creas la lista y añades a ella el cliente. Si ya existía, simplemente lo añades. Cuando quieras recuperar

Código Java:
Ver original
  1. List<Client> clientes = map.get(clave);

y tendrías la lista de clientes con esa clave. He puesto LinkedList<> por poner algo, puedes poner ArrayList<> o cualquier otra implementación de List<> que te guste más.

Otro detalle, si hay posibilidad por el motivo que sea de que añadas el mismo cliente varias veces, antes de añadirlo deberías recorrer la lista para ver que no está ya.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #9 (permalink)  
Antiguo 01/04/2015, 11:28
 
Fecha de Ingreso: marzo-2015
Mensajes: 45
Antigüedad: 4 años, 10 meses
Puntos: 2
Respuesta: HashMap - Manejo de colisiones

Cita:
Iniciado por Profesor_Falken Ver Mensaje
Buenas,

10000 elementos no es nada para una lista hoy en dia. Los puedes recorrer en un bucle en microsegundos.

La coleccion que necesitas es una implementacion de la interfaz List. ArrayList, por ejemplo, te funcionara bien.

Podrias create un pequeno pojo:
HashCliente
--hash
--cliente
gets/sets


Y creas una lista:
List<HashCliente> hashCliente = new ArrayList<>();

Posteriormente para encontrar todas las coincidencias solo tendras que recorrer la lista y retornar una nueva lista con todas las coincidencias encontradas.

Un saludo
Hola...

Esta es la respuesta que buscas. Suerte!
  #10 (permalink)  
Antiguo 02/04/2015, 18:33
 
Fecha de Ingreso: diciembre-2008
Mensajes: 50
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: HashMap - Manejo de colisiones

Muchas gracias chicos, la verdad es que se me aclaró la duda :)

Etiquetas: hashmap, manejo, programa
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 10:00.