Ver Mensaje Individual
  #1 (permalink)  
Antiguo 17/04/2017, 22:14
Avatar de detective_jd
detective_jd
 
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años, 7 meses
Puntos: 6
Implementar TablaHash

Hola a todos, tengo una consulta que hacerles verán estoy viendo cómo implementar un HashMap y encontré una implementación bastante simplificada pero tengo problemas para agregar las entradas hash ya que no me guarda bien los elementos:

Código Java:
Ver original
  1. private int findEntry(Object key){
  2.        // System.out.println("hashcode -> " + hash(key.hashCode()));
  3.         int hash = (key == null) ? 0 : hash(key.hashCode());        
  4.         int index =  hash & (table.length-1);
  5.        // System.out.println("pase -> " + index);
  6.         return index;
  7.     }
  8. static int hash(Object key) {
  9.         int h;
  10.         return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
  11.     }
  12. private HashEntry<K,V> getEntry(Object key){
  13.         HashEntry<K,V> e = table[findEntry(key)];
  14.         return (e != null && key.equals(e.key)) ? e : null;
  15.     }
  16. public V put(K key, V value) {
  17.         if(key == null){
  18.             return null;
  19.         }
  20.         Entry<K,V> e = this.getEntry(key);    
  21.         if(e != null){
  22.             return table[findEntry(key)].setValue(value);            
  23.         } else if(size == table.length){
  24.             table = Arrays.copyOf(table, table.length +1);
  25.         }
  26.         table[findEntry(key)] = new HashEntry(key,value);
  27.         size++;
  28.         return null;
  29.     }
  30. /*-----------------------------------------------------------*/    
  31.     protected class HashEntry<K,V> implements Entry<K,V> {
  32.         protected K key;
  33.         protected V value;
  34.         public HashEntry(K k, V v) {
  35.             key = k;
  36.             value = v;
  37.         }
  38.         @Override
  39.         public V getValue() {
  40.             return value;
  41.         }
  42.         @Override
  43.         public K getKey() {
  44.             return key;
  45.         }
  46.         @Override
  47.         public V setValue(V val) {
  48.             V oldValue = value;
  49.             value = val;
  50.             return oldValue;
  51.         }      
  52.         @Override
  53.         public int hashCode() {
  54.             return Objects.hashCode(key) ^ Objects.hashCode(value);
  55.         }        
  56.         @Override
  57.         public boolean equals(Object obj) {
  58.             if(obj instanceof HashEntry){
  59.                 HashEntry<K, V> ent = (HashEntry<K, V>) obj;
  60.                 return Objects.equals(key, ent.key) && Objects.equals(value, ent.value);
  61.             } else {
  62.                 return false;
  63.             }
  64.         }
  65.         @Override
  66.         public String toString() {
  67.             return "(key: " + key + ", value: " + value + ")";
  68.         }
  69.     }

Calculo que mi problema está en cómo tengo el hashCode y la función hash pero no le he encontrado la vuelta, por favor denme una mano con esto.

Espero sus respuestas y saludos.