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

[SOLUCIONADO] TablaHash y sus pasos

Estas en el tema de TablaHash y sus pasos en el foro de Java en Foros del Web. CalgaryCorpus no sé si me aplaudirás o querrás golpearme pero hice esto en consola y verás cual es el error: antes: null después del anterior: ...

  #31 (permalink)  
Antiguo 05/12/2017, 22:59
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años, 7 meses
Puntos: 6
Respuesta: TablaHash y sus pasos

CalgaryCorpus no sé si me aplaudirás o querrás golpearme pero hice esto en consola y verás cual es el error:

antes: null
después del anterior: Denisse
después: null
antes del posterior: Denisse

antes: Denisse
después del anterior: Franco
después: null
antes del posterior: Franco

antes: Franco
después del anterior: Manuela
después: null
antes del posterior: Manuela

antes: Manuela
después del anterior: Deborah
después: null
antes del posterior: Deborah

antes: Deborah
después del anterior: Miguel
después: null
antes del posterior: Miguel

--- se agrandó la estructura por 8 ---

antes: null
después del anterior: Denisse
después: null
antes del posterior: Denisse

antes: Denisse
después del anterior: Franco
después: null
antes del posterior: Franco

antes: Franco
después del anterior: Miguel
después: null
antes del posterior: Miguel

antes: Miguel
después del anterior: Manuela
después: null
antes del posterior: Manuela

antes: Manuela
después del anterior: Deborah
después: null
antes del posterior: Deborah

antes: Deborah
después del anterior: Tommy
después: null
antes del posterior: Tommy

Denisse
Franco
Miguel
Manuela
Deborah
Tommy

Cuando se agranda el array interno de la estructura pierde el órden que tenía anteriormente, ahora la pregunta ¿cómo arreglar ese detalle? ¿debo empezar por la función hash o por dónde?

Este código con los mensajes no se verá en el repositorio pero lo estoy usando para verificar el error, en el repositorio de la estructura MyLinkedMap.java aparece el addBefore pero sin los mensajes.

Código Java:
Ver original
  1. void addBefore(Entry<K,V> existingEntry) {
  2.             before = (Entry<K, V>) head.before;
  3.             after  = (Entry<K, V>) head;
  4.             before.after = this;
  5.             after.before = this;
  6.             System.out.println("antes: " + before.key);
  7.             System.out.println("después del anterior: " + before.after.key);
  8.             System.out.println("después: " + after.key);
  9.             System.out.println("antes del posterior: " + after.before.key);
  10.             System.out.println("");
  11.         }


No sé si tú o alguien más me dará alguna idea.

Espero sus respuestas y saludos.
  #32 (permalink)  
Antiguo 27/12/2017, 22:39
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años, 7 meses
Puntos: 6
Respuesta: TablaHash y sus pasos

Muy buenas a todos, les comento que resolví el problema resulta que:

necesitaba una variable de carga de factor y otra más para mantener el órden de los datos

Código Java:
Ver original
  1. private static final float LOAD_FACTOR = 0.75f;
  2.     private static int threshold;

también tenía que cambiar el constructor

Código Java:
Ver original
  1. public MyMap(int xcap) {
  2.         if(xcap <= 0){
  3.             throw new IllegalArgumentException("Capacidad no permitida: " + xcap);
  4.         }
  5.         threshold = (int) (xcap * LOAD_FACTOR);
  6.         table = new Entry[xcap];
  7.         size = 0;
  8.         init();
  9.     }

además de rehacer el addEntry

Código Java:
Ver original
  1. private void addEntry(K key, V value){
  2.         if(size >= threshold){
  3.             Entry newTable[] = new Entry[table.length * 2];
  4.             transfer(newTable);
  5.             table = newTable;
  6.             threshold = (int)(newTable.length * LOAD_FACTOR);
  7.         }
  8.         createEntry(key, value);
  9.     }

y poner un método de transferencia de datos

Código Java:
Ver original
  1. private void transfer(Entry newTable[]){
  2.         for (Entry<K, V> entry : table) {
  3.             if (entry != null) {
  4.                 Entry<K,V> current = entry;
  5.                 while(current != null){
  6.                     Entry<K,V> et = current;
  7.                     current = current.next;
  8.                     int index = hash(et.key,newTable.length);
  9.                     et.next = newTable[index];
  10.                     newTable[index] = et;
  11.                 }
  12.             }
  13.         }
  14.     }

Con eso ahora puedo ordenar por inserción, pero CalgaryCorpus te quería preguntar lo siguiente, en la parte que dices:

Cita:
Haz un metodo que te permita espiar tus estructuras y espialas por cada insercion que hagas, luego revisa el metodo que usas para imprimir los datos.
No se me ocurre otra forma de espiar que mostrar los mensajes con System.out.println.

Pongo el código: https://goo.gl/Ar3vMN

Espero sus respuestas y saludos.

Etiquetas: pasos
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 02:18.