Ver Mensaje Individual
  #9 (permalink)  
Antiguo 06/06/2017, 22:29
Avatar de detective_jd
detective_jd
 
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: TablaHash y sus pasos

Hola CalgaryCorpus los test que he hecho comprobaban los casos favorables es decir cuando funcionan xq cuando no te tira una excepción, depuré el código y estos fueron los errores con los que me encontré:

debug:
java.lang.Exception
at hashsetsimple.test.Test.comprobar_que(Test.java:6)
at hashsetsimple.test.ConstructorTest.creando_set_con _capacidad_de_dos_elementos(ConstructorTest.java:2 9)
at hashsetsimple.test.ConstructorTest.test(Constructo rTest.java:74)
at hashsetsimple.interfaz.Cuerpo.main(Cuerpo.java:10)
java.lang.Exception
at hashsetsimple.test.Test.comprobar_que(Test.java:6)
at hashsetsimple.test.UnionTest.probando_union_normal (UnionTest.java:30)
at hashsetsimple.test.UnionTest.test(UnionTest.java:6 2)
at hashsetsimple.interfaz.Cuerpo.main(Cuerpo.java:20)
BUILD SUCCESSFUL (total time: 33 seconds)

Y adivina ¿dónde está la falla? en que cuando la función hash me calcula el índice hacía uno que ya existe me reemplaza el contenido actual por el nuevo (malditas colisiones) pero también me borra un elemento existente sin invocar el remove.

Por cierto intenté obtener la última entrada del índice con una función privada para luego en addEntry preguntar con un if sí era el último, no funcionaba, intenté con esto ahora:

Código Java:
Ver original
  1. private void addEntry(K key, V value){
  2.         if(size >= table.length * 0.75){
  3.             Entry<K,V>[] tmp = table;
  4.             size = 0;
  5.             table = Arrays.copyOf(table, table.length * 2);
  6.             for(int i = 0; i < table.length; i++){
  7.                 table[i] = null;
  8.             }
  9.             for (Entry<K, V> e : tmp) {    
  10.                 if(e != null){
  11.                     put(e.getKey(),e.getValue());
  12.                 }
  13.             }            
  14.         }
  15.         int hash = hash(key,table.length);
  16.         Entry<K,V> et = new Entry(key, value,table[hash]);
  17.         if(table[hash] == null){
  18.             table[hash] = et;
  19.         } else {
  20.             Entry<K,V> l = this.getLast(hash);
  21.             for (Entry e = table[hash]; e != null; e = e.next) {
  22.                 if(l == e){
  23.                     e.next = et;
  24.                     break;
  25.                 }
  26.             }
  27.         }
  28.         size++;
  29.     }
  30.     private Entry<K,V> getLast(int hash){
  31.         Entry<K,V> l = null;
  32.         for (Entry e = table[hash]; e != null; e = e.next) {
  33.             l = e;
  34.         }
  35.         return l;
  36.     }

Este código tiene sentido para tí o es una locura enorme??

Dejé más organizado el código: https://github.com/detectivejd/HashS.../hashsetsimple

Espero sus respuestas y saludos.