Ver Mensaje Individual
  #17 (permalink)  
Antiguo 26/04/2017, 22:44
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: Implementar TablaHash

Les cuento solucioné mi problema con lo de los índices, arreglando mi problema de esta forma:

crear una función para obtener el indice vacio para almacenar en el put

Código Java:
Ver original
  1. private int indexPut() {
  2.         for(int i= 0 ; i < table.length; i++){
  3.             if(table[i] == null){
  4.                  return i;
  5.             }
  6.         }
  7.         return -1;
  8.     }

Y para cuando quiero filtrar mi map para el get, containsKey y remove, hago otra función pasándole cómo parámetro la clave:

Código Java:
Ver original
  1. private int getIndex(Object key) {
  2.         for(int i= 0 ; i < table.length; i++){
  3.             if(table[i] != null && table[i].getKey() == key){
  4.                  return i;
  5.             }
  6.         }
  7.         return -1;
  8.     }

Aunque eso me hizo unos cuantos cambios, pero la estructura ya está en su 95% de funcionamiento salvo que no me anda el putAll:

Código Java:
Ver original
  1. @Override
  2.     public V put(K key, V value) {
  3.         if(key == null){
  4.             return null;
  5.         } else {
  6.             int index = indexPut();
  7.             Entry<K, V> pair = table[index];
  8.             if(size == table.length){
  9.                 table = Arrays.copyOf(table, table.length +1);
  10.             }
  11.             if (pair != null && pair.getKey().equals(key)) {
  12.                 V oldValue = pair.getValue();
  13.                 pair.setValue(value);
  14.                 return oldValue;
  15.             }            
  16.             table[index] = new Entry(key, value);
  17.             size++;
  18.             return value;
  19.         }
  20.     }
  21. @Override
  22.     public void putAll(Map<? extends K, ? extends V> m) {
  23.         if(m.size() > 0){
  24.             m.entrySet().forEach((e) -> {
  25.                 this.put(e.getKey(), e.getValue());
  26.             });
  27.         }
  28.     }

El problema se debe a que le pongo al inicializar un tamaño de 4 para probar si aumenta el almacenamiento del map en la función put pero no funciona.

Este error me da:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at hashmapsimple.MyMap.put(MyMap.java:38)
at hashmapsimple.MyMap.lambda$putAll$0(MyMap.java:135 )
at java.util.HashMap$EntrySet.forEach(HashMap.java:10 43)
at hashmapsimple.MyMap.putAll(MyMap.java:134)
at hashmapsimple.Cuerpo.main(Cuerpo.java:15)
/home/detectivejd/.cache/netbeans/8.2/executor-snippets/run.xml:53: Java returned: 1
BUILD FAILED (total time: 0 seconds)

Espero sus respuestas y Saludos.