Ver Mensaje Individual
  #18 (permalink)  
Antiguo 29/10/2017, 22:57
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
Respuesta: TablaHash y sus pasos

Buenas a todos, acá ando con lo siguiente: decidí cambiar un poco a MyLinkedMap y tuve que adaptar el código de MyMap, pero tengo este pequeño problema en la consola:

run:
--TEST NORMAL--
tamaño -> 4

--valores--
Deborah

Tomás

Franco

Deborah

Tomás

Franco

Manuela

--claves--
1

2

3

1

2

3

4

--entradas--
clave -> 1 valor -> Deborah

clave -> 2 valor -> Tomás

clave -> 3 valor -> Franco

clave -> 1 valor -> Deborah

clave -> 2 valor -> Tomás

clave -> 3 valor -> Franco

clave -> 4 valor -> Manuela

Lo raro es que tendría que aparecerme las entradas 1,2,3 y 4 y no repetidos, acá pongo el código cambiado de MyLinkedMap:

Código Java:
Ver original
  1. @Override
  2.     protected void createEntry(K key, V value) {
  3.         int hash = hash(key,table.length);
  4.         Entry<K,V> e = new Entry(key, value);
  5.         table[hash] = e;
  6.         e.addBefore(head);
  7.         size++;
  8.     }
  9.  
  10. class Entry<K,V> extends MyMap.Entry {
  11.         Entry<K,V> before, after;
  12.         public Entry(K xkey, V xvalue) {
  13.             super(xkey, xvalue);
  14.         }
  15.         private void addBefore(Entry<K,V> existingEntry) {
  16.             after  = existingEntry;
  17.             before = existingEntry.before;
  18.             before.after = this;
  19.             after.before = this;
  20.         }
  21.  
  22.         @Override
  23.         void recordAccess(MyMap m) {
  24.             MyLinkedMap<K,V> lm = (MyLinkedMap<K,V>)m;
  25.             if (lm.accessOrder) {
  26.                 remove();
  27.                 addBefore((Entry<K, V>) lm.head);
  28.             }
  29.         }
  30.         @Override
  31.         void recordRemoval(MyMap m) {
  32.             remove();
  33.         }
  34.         private void remove() {
  35.             before.after = after;
  36.             after.before = before;
  37.         }
  38.     }

Porque en MyMap tuve que adaptar el put, además de agregar el init al constructor para inicializar la cabecera en el Linked:

Código Java:
Ver original
  1. @Override
  2.     public V put(K key, V value) {
  3.         if(key != null){
  4.             int hash = hash(key,table.length);
  5.             for(Entry<K,V> e = table[hash]; e != null; e = e.next){
  6.                 if(e.getKey().equals(key)){
  7.                     V oldValue = e.getValue();
  8.                     e.setValue(value);
  9.                     e.recordAccess(this);
  10.                     return oldValue;
  11.                 } else if(e.next == null){
  12.                     e.next = new Entry(key,value);
  13.                     e.recordAccess(this);
  14.                     size++;
  15.                     return value;
  16.                 }                
  17.             }
  18.             this.addEntry(key, value);
  19.             return value;                    
  20.         } else {
  21.             return null;
  22.         }
  23.     }

Me gustaría arreglar esto pero no sé me ocurre nada, espero sus respuestas y saludos.