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. Este tema es una continuación de este tema como consejo de CalgaryCorpus . Pongo el código subido: https://github.com/detectivejd/HashS.../hashsetsimple En fín la situación es esta: Mis ...

  #1 (permalink)  
Antiguo 28/05/2017, 19:46
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
TablaHash y sus pasos

Este tema es una continuación de este tema como consejo de CalgaryCorpus.

Pongo el código subido:

https://github.com/detectivejd/HashS.../hashsetsimple

En fín la situación es esta:

Mis dudas están con los métodos extras como containsAll que verifica si el set tiene todos los elementos de una coleccion, si no tiene uno devuelve falso.
el retainAll que conserva los elementos comúnes pero borra los otros y el removeAll borra todos los elementos de una colección, y la pregunta es:
¿para que los quiero? ¿porque las interfaces List y Set los tienen? ¿no era más fácil que las estructuras list y set no implementaran Collection? xq tiene las mismas
firmas Collection, además parece que el que creo parte del lenguaje tenía fascinación por las matemáticas digo por lo de conjuntos, intersecciones y demás.

Con respecto a errores me dice esto:

java.lang.Exception
at hashsetsimple.Test.comprobar_que(Test.java:6)
at hashsetsimple.ConstructorTest.creando_set_con_capa cidad_de_dos_elementos(ConstructorTest.java:25)
at hashsetsimple.ConstructorTest.test(ConstructorTest .java:70)
at hashsetsimple.Cuerpo.main(Cuerpo.java:7)

Lo más curioso es que en vez de guardarme 7 elementos me guarda 6, no quiero pensar que el error esta en la función hash, no sé que se te ocurre xq lo demás no da error alguno.

Espero sus respuestas y saludos.
  #2 (permalink)  
Antiguo 28/05/2017, 23:24
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: TablaHash y sus pasos

Las preguntas que haces al inicio no tienen que ver con Java, sino con estructuras de datos. Lista y Set son ambas colecciones de elementos, pero el set tiene caracteristicas que la lista no, y viceversa. En un set los elementos no estan repetidos, no existe orden necesariamente. Un set o conjunto, es un conjunto si cumple propiedades matematicas, sino el nombre no calzaria. Se definen operaciones sobre los conjuntos, union, interseccion, etc. Sugiero leas respecto a las estructuras de datos que quieres implementar, no ponerte a implementar sin entenderlas.

No mire' todo exhaustivamente, eso lo tienes que hacer tu, pero lo que mire es que la interseccion claramente esta mal, a menos que sea yo el que entienda mal lo que escribiste. Al leer el codigo pense', como puedes borrar de un conjunto un elemento que NO esta en ese conjunto? Eso es lo que dice tu codigo.

Haz un test que pruebe la interseccion matematicamente: dados 2 conjuntos con elementos comunes, la interseccion deberia obtener los elementos comunes, tienes una prueba asi? estas comprobando que la interseccion efectivamente obtiene los elementos comunes de los 2 conjuntos involucrados?

Lo mismo con todos los tests, haz las pruebas matematicas de conjuntos. No pruebes solamente que tus metodos se ejecutan, sino que los resultados tengan sentido matematico.

Los sets te daran muchas oportunidades de probar otras cosas, por ejemplo hacer interseccion o union de un conjunto sobre si mismo.

S interseccion S => S
S union S => S

O hacer interseccion o union con el conjunto vacio, interseccion de 2 conjuntos disjuntos, interseccion e union de conjunto vacio, etc.

Si tienes una excepcion, revisa por que ocurre, que es lo que estas haciendo o dejando de hacer que, por ejemplo, accedes a una referencia invalida.

Suerte.
__________________
Visita mi perfil en LinkedIn
  #3 (permalink)  
Antiguo 31/05/2017, 22:57
Avatar de 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, mira que hice las siguientes cosas:

Cita:
No mire' todo exhaustivamente, eso lo tienes que hacer tu, pero lo que mire es que la interseccion claramente esta mal, a menos que sea yo el que entienda mal lo que escribiste. Al leer el codigo pense', como puedes borrar de un conjunto un elemento que NO esta en ese conjunto? Eso es lo que dice tu codigo.
Eso esta corregido, el removeAll y el retainAll lo arreglé, no tenía muy claro lo que hacía xq eran nuevos para mí.

Cita:
Haz un test que pruebe la interseccion matematicamente: dados 2 conjuntos con elementos comunes, la interseccion deberia obtener los elementos comunes, tienes una prueba asi? estas comprobando que la interseccion efectivamente obtiene los elementos comunes de los 2 conjuntos involucrados?

Lo mismo con todos los tests, haz las pruebas matematicas de conjuntos. No pruebes solamente que tus metodos se ejecutan, sino que los resultados tengan sentido matematico.

Los sets te daran muchas oportunidades de probar otras cosas, por ejemplo hacer interseccion o union de un conjunto sobre si mismo.

S interseccion S => S
S union S => S

O hacer interseccion o union con el conjunto vacio, interseccion de 2 conjuntos disjuntos, interseccion e union de conjunto vacio, etc.
La verdad esos no los tenía pero puse los test de intersección, diferencia, subconjunto, unión. Sólo que el de la unión normal no anda por la función hash que me saca un elemento existente para agregar uno de la colección.

¿Recuerdas el problema de la capacidad? lo resolví cambiando:

de esto:

Código Java:
Ver original
  1. if(size >= table.length * 3/4){

a esto:

Código Java:
Ver original
  1. if(size >= table.length * 1/2){

pero en vista al fallo de ahora que parece que es el mismo problema parece que hay algo que le falta al HashMap (MyMap.java) pero no sé que le falta.

Cita:
Las preguntas que haces al inicio no tienen que ver con Java, sino con estructuras de datos. Lista y Set son ambas colecciones de elementos, pero el set tiene caracteristicas que la lista no, y viceversa. En un set los elementos no estan repetidos, no existe orden necesariamente. Un set o conjunto, es un conjunto si cumple propiedades matematicas, sino el nombre no calzaria. Se definen operaciones sobre los conjuntos, union, interseccion, etc. Sugiero leas respecto a las estructuras de datos que quieres implementar, no ponerte a implementar sin entenderlas.
Se que las listas se manejan con posiciones para todas sus funcionalidades y que puedes ordenar sus datos, y que con los conjuntos (set) evitan los duplicados de datos, eso lo sabía, lo que me llamaba la atención que las firmas de sus funcionalidades sean las mismas en sus respectivas interfaces pero al ver que heredan de Collection me debo callar la boca xq aplican lo que llamamos principio de dependencia "una entidad de alto nivel no debe depender de otra de bajo nivel, sino de intermediarias".

Pero lo del problema de la función hash me preocupa.

Aquí pongo el repositorio del código:

https://github.com/detectivejd/HashS.../hashsetsimple

Espero sus respuestas y Saludos.
  #4 (permalink)  
Antiguo 01/06/2017, 07:27
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: TablaHash y sus pasos

Si no eres capaz de darte cuenta por tus tests que es lo que falla, estas en un estado de perplejidad que no sabes que es lo que ocurre, etc. tienes que meditar respecto a los tests que estas haciendo.
- no estas haciendo suficientes tests

los test que si' estas haciendo
- estan malos o
- estan incompletos o
- prueban aquello que no te sirve.

Mirando alguno de ellos, se ve inmediatamente la fragilidad que ellos tienen.
Me refiero a que si la implementacion estuviera mala (como lo esta') algunos de tus tests igual pasarian y no se reportaria error. Tu necesitas hacer que los tests fallen cuando la implementacion este mala.

Imaginate que tu set modificara los datos y en vez de realmente mantener un set, hiciera una copia de un elemento cualquiera, inventado.
Por ejemplo, yo inserto 3, 4,5 en el set, y este guardara, dentro 1, 1, 1. (3 veces el numero 1). Cuantos de tus tests pasarian sin reportar error?
Ok, olvidate de eso, pero solo por un rato, imaginate que esto no fuera al insertar, sino al hacer las otras operaciones, cuando intersectas, o haces union, el hashmap se vuelve loco y se pone a repetir cosas e ignora la entrada. Cuantos de tus tests pasarian sin reportar error?

No lo tomes literalmente, tal vez no es lo que te esta' ocurriendo, tu Hashmap no esta repitiendo nada, o eso creo. Solo te lo doy como ejemplo para que analices tus tests y veas que ellos son fragils y lo que prueban no sirve.
A veces te conviene cambiar la implementacion de lo que tienes, a proposito, para ver si tus tests se dan cuenta de lo malo que hay detras, en este caso, dado que tus tests son malos, tu no te das cuenta de la implementacion mala porque ellos pasan sin reportar la mala implementacion.

Una vez que tengas la confianza que tus tests no son fragiles, es momento de ver cuales en particular fallan, y cuando ellos son solo algunos, es momento de depurar, pero parte arreglando los tests. Ellos te daran mas informacion una vez que esten bien escritos.
__________________
Visita mi perfil en LinkedIn

Última edición por CalgaryCorpus; 01/06/2017 a las 08:24
  #5 (permalink)  
Antiguo 03/06/2017, 22:42
Avatar de 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 estuve viendo el error y el problema está con las malditas colisiones, y la solución está en lo que algunos llaman separate chaining.
Pero cómo lo implemento??

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.                     return oldValue;
  10.                 }                
  11.             }
  12.             this.addEntry(key, value);
  13.             return value;                    
  14.         } else {
  15.             return null;
  16.         }
  17.     }
  18.     private void addEntry(K key, V value){
  19.         if(size >= table.length * 1/2){
  20.             Entry<K,V>[] tmp = table;
  21.             size = 0;
  22.             table = Arrays.copyOf(table, table.length * 2);
  23.             for(int i = 0; i < table.length; i++){
  24.                 table[i] = null;
  25.             }
  26.             for (Entry<K, V> e : tmp) {    
  27.                 if(e != null){
  28.                     put(e.getKey(),e.getValue());
  29.                 }
  30.             }            
  31.         }
  32.         int hash = hash(key,table.length);
  33.         table[hash] = new Entry(key, value,table[hash]);
  34.         size++;
  35.     }

Porque así tengo para agregar entradas al array, pero ¿cómo rayos implemento el separate chaning? porque con eso resuelvo ese problema.

Espero sus respuestas y saludos.
  #6 (permalink)  
Antiguo 04/06/2017, 19:50
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: TablaHash y sus pasos

Mejora tus tests.
__________________
Visita mi perfil en LinkedIn
  #7 (permalink)  
Antiguo 04/06/2017, 20:25
Avatar de 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 en base al test de los Set es que me dí cuenta del problema de las colisiones, pero estoy casi con el problema resuelto:

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.             for (Entry e = table[hash]; e != null; e = e.next) {
  21.                  // sólo necesito obtener la última entrada y así reemplazo el siguiente del último por la entrada nueva
  22.             }
  23.         }
  24.         size++;
  25.     }

Sólo queda eso para resolver lo de las colisiones, creo.

Por otro lado, dices esto:

Cita:
Mejora tus tests.
No me doy cuenta que debo mejorar de los test, sinceramente no se me ocurre un test más o que mejora hacer.

Espero sus respuestas y saludos.
  #8 (permalink)  
Antiguo 04/06/2017, 23:40
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: TablaHash y sus pasos

Revisa mi post anterior, tus tests estan (o estaban?) malos. Mejoralos.
__________________
Visita mi perfil en LinkedIn
  #9 (permalink)  
Antiguo 06/06/2017, 22:29
Avatar de 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.
  #10 (permalink)  
Antiguo 07/06/2017, 08:16
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: TablaHash y sus pasos

Comantario general: Un hash DEBE manejar colisiones. No es algo raro, una excepcion, una cosa que no ocurre, algo raro, algo maldito. Al reves, es algo comun, predecible, esperable, normal, etc. Tus implementacion y tus tests tienen que considerarlas. Si no funcionan, mejoralo y (lo habia mencionado?) mejora tus tests.

Es 3ra vez que te digo que mejores tus tests y no parece haber ninguna evidencia que lo hagas. Sigo viendo los mismos problemas en tus tests: ante una mala implementacion, (algunos de) tus tests pasaran igual.

Como puedes confiar en tests que ante una mala implementacion igual pasaran?

Es posible que ahora algunos tests fallen y te sirvan para darte cuenta de algunos problemas, pero ... una vez que aquello que ahora falla este' bien y tus tests pasen, tu creeras que por fin lo has logrado, pero con los tests actuales si existen problemas, tus tests igual pasaran. Lee otra vez lo que ya escribi y revisa detenidamente lo que ahi digo, e intenta ver que problema hay en tus tests que hacen que ellos reportan que todo esta bien incluso cuando no esta bien todo.

Ultima vez que te lo digo antes de desaparecer para ver si tomas en cuenta lo que te digo: mejora tus tests.
__________________
Visita mi perfil en LinkedIn
  #11 (permalink)  
Antiguo 07/06/2017, 22:23
Avatar de 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 tienes razón al molestarte por mi necedad, porque que mi código apesta (lo digo yo) es cierto xq no sé cómo manejar lo de las colisiones que es con lo que me estoy golpeando bastante, ya que la única referencia que tengo para enfrentarlo es este link.

Por otro lado es verdad que no sé me ocurre cómo mejorar mis test al igual que mi implementación sacando lo de las colisiones, recuerdo que en el otro post de TablaHash me diste una lista de que cosas mejorar: https://goo.gl/9Unp4p, porque de esa forma me daré cuenta que cambiar o sacar del código, es más digo que luego de solucionar lo de las colisiones tendría que ver remove para borrar la entrada colisionada, pero eso es una suposición que hago, que me puedo equivocar.

No te enojes conmigo por este mensaje, pero es lo que me pasa.

Espero sus respuestas y saludos.
  #12 (permalink)  
Antiguo 10/06/2017, 20:42
Avatar de 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 a todos, finalmente pude con el problema de las colisiones, era de esto:

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.                     return oldValue;
  10.                 }                
  11.             }
  12.             this.addEntry(key, value);
  13.             return value;                    
  14.         } else {
  15.             return null;
  16.         }
  17.     }

a esto, tuve que agregar otro if para lo de las colisiones:

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.                     return oldValue;
  10.                 } else if(e.next == null){
  11.                     e.next = new Entry(key,value);
  12.                     size++;
  13.                     return value;
  14.                 }                
  15.             }
  16.             this.addEntry(key, value);
  17.             return value;                    
  18.         } else {
  19.             return null;
  20.         }
  21.     }

Ahora bien, seguiré haciendo pruebas a parte de las subidas en github, por lo que pido nuevamente que si ven que hay que mejorar del código y de los test que me lo escriban, así podré darle al clavo.

https://github.com/detectivejd/HashS.../hashsetsimple

https://github.com/detectivejd/HassM.../hashmapsimple

Espero sus respuestas y saludos.

Última edición por detective_jd; 11/06/2017 a las 18:48
  #13 (permalink)  
Antiguo 11/06/2017, 19:10
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: TablaHash y sus pasos

También me había olvidado decir que para que lo de las colisiones ande, tenía que cambiar mi clase interna entry cosa que el next de la entrada sea null xq de lo contrario no iba a funcionar

Código Java:
Ver original
  1. class Entry<K,V> implements Map.Entry<K,V>{
  2.         final K key;
  3.         V value;
  4.         Entry<K,V> next;
  5.         public Entry(K xkey, V xvalue) {
  6.             this.key = xkey;
  7.             this.value = xvalue;
  8.             this.next = null;
  9.         }        
  10.         @Override
  11.         public K getKey() {
  12.             return key;
  13.         }
  14.         @Override
  15.         public V getValue() {
  16.             return value;
  17.         }
  18.         @Override
  19.         public V setValue(V v) {
  20.             V val = value;
  21.             value = v;
  22.             return val;
  23.         }        
  24.     }

Nuevamente digo y pido si pueden mandarme por este post o como mensaje privado, los bugs, mejoras en el código o test xq si me dicen exactamente que falla o falta lo pongo.

Espero sus respuestas y saludos.
  #14 (permalink)  
Antiguo 17/07/2017, 21:36
Avatar de 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 a todos, en estos días no me anduve debido a que andaba con gripe y no me sentía bien cómo para andar programando, pero ahora estoy bien como para seguir.

Estuve haciendo una pequeña prueba y me ví que con las claves númericas no me genera colisiones:

0:
1: (1)
2: (2)
3: (3)
4: (4)
5: (5)
6: (6)
7: (7)
8: (8)
9: (9)
10: (10)
11: (11)
12: (12)
13: (13)
14: (14)
15: (15)
16: (16)
17: (17)
18: (18)
19: (19)
20: (20)
21: (21)
22: (22)
23: (23)
24: (24)
25: (25)
26: (26)
27: (27)
28: (28)
29: (29)
30: (30)
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:

pero cuando las claves son string, aunque parezca mentira si genera colisiones:

0:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11: (Satoshi)
12: (Gaurav)
13:
14:
15: (Awadh)
16: (Rahul) (P)
17: (Q)
18: (R)
19: (Luis) (S)
20: (Santiago) (T)
21: (U)
22: (V)
23: (Richard) (W)
24: (Serena) (X)
25: (Y)
26: (Z)
27:
28:
29:
30: (Ada)
31: (Lidia)

Les pregunto: ¿Que debería mejorar en el código y/o en los test? hace semanas que no toco nada jeje

Código de HashSet Casero

Código de HashMap Casero

Espero sus respuestas y saludos.
  #15 (permalink)  
Antiguo 27/07/2017, 18:00
Avatar de 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 a todos, cómo están? espero que bien. En vista que no tuve ninguna respuesta o critica del código, comencé a desarrollar el código de LinkedHashMap casero, pero no estoy muy inspirado que digamos, no sé si estoy bien encaminado o no en el asunto.

Pongo el código:

Código Java:
Ver original
  1. package linkedmapsimple;
  2. import java.util.Map;
  3. public class MyLinkedMap<K,V> extends MyMap<K,V>
  4. {
  5.     private Entry<K,V>header;
  6.     private boolean accessOrder;
  7.     public MyLinkedMap() {
  8.         super();
  9.         accessOrder = false;
  10.     }
  11.  
  12.     public MyLinkedMap(int xcap) {
  13.         super(xcap);
  14.         accessOrder = false;
  15.     }
  16.  
  17.     public MyLinkedMap(Map<? extends K, ? extends V> m) {
  18.         super(m);
  19.         accessOrder = false;
  20.     }
  21.    
  22.     @Override
  23.     public void clear() {
  24.         super.clear();
  25.         header.before = header.after = header;
  26.     }
  27.     @Override
  28.     public boolean containsValue(Object value) {
  29.         // Overridden to take advantage of faster iterator        
  30.         if (value==null) {
  31.             for (Entry e = header.after; e != header; e = e.after)
  32.                 if (e.value==null)
  33.                     return true;
  34.         } else {
  35.             for (Entry e = header.after; e != header; e = e.after)
  36.                 if (value.equals(e.value))
  37.                     return true;
  38.         }
  39.         return false;
  40.     }
  41.     private void addEntry(K key, V value){
  42.        
  43.     }
  44.     class Entry<K,V> extends MyMap.Entry {
  45.         Entry<K,V> before;
  46.         Entry<K,V> after;
  47.         public Entry(K xkey, V xvalue) {
  48.             super(xkey, xvalue);
  49.         }
  50.         private void remove() {
  51.             before.after = after;
  52.             after.before = before;
  53.         }
  54.         private void addBefore(Entry<K,V> existingEntry) {
  55.             after  = existingEntry;
  56.             before = existingEntry.before;
  57.             before.after = this;
  58.             after.before = this;
  59.         }
  60.     }
  61. }

En especial con el addEntry teniendo en cuenta mi código del HashMap.

Código del HashMap Casero

Espero sus respuestas y Saludos.

PD: Para aclarar, no estoy en plan de "háganme el código" porque esa no es la idea para nada.
  #16 (permalink)  
Antiguo 02/09/2017, 21:11
Avatar de 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 a todos, les comento que acabo de subir el repositorio con el código del LinkedHashMap a github, aprovecho a pedir una mano con respecto de si hay una falla o detalle a poner del código, además de los test que pueden faltar o mejorar.

Código del LinkedHashMap Casero

Código del HashMap Casero

Espero sus respuestas y Saludos.
  #17 (permalink)  
Antiguo 24/10/2017, 22:58
Avatar de 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 a todos, empecé a hacer el LinkedHashSet casero, y esta hecho:

Código Java:
Ver original
  1. package linkedsetsimplev1;
  2. import java.util.Collection;
  3. public class MyLinkedSet<E> extends MySet<E>
  4. {
  5.     public MyLinkedSet() {
  6.         super(4,true);
  7.     }
  8.     public MyLinkedSet(int xcap) {
  9.         super(xcap,true);
  10.     }
  11.     public MyLinkedSet(Collection<? extends E> c) {
  12.         super(c.size(),true);
  13.         addAll(c);
  14.     }
  15. }

A lo que tuve que hacer mejoras en MySet, MyMap y MyLinkedMap, pero estoy teniendo problemas con el iterator para que muestre el siguiente ya que tengo en las entradas, el que está antes y después pero también tengo el sgte:

Código Java:
Ver original
  1. public MyLinkedMap.Entry<K, V> nextNode() {
  2.             MyLinkedMap.Entry<K, V> e = next;            
  3.             current = e;
  4.             next = e.after;
  5.             return e;
  6. }
  7.  
  8. static class Entry<K,V> extends MyMap.Entry {
  9.         Entry<K,V> before = null;
  10.         Entry<K,V> after = null;
  11.         public Entry(K xkey, V xvalue) {
  12.             super(xkey, xvalue);
  13.         }
  14.     }

En la consola me muestra esto:

run:
ORDEN NORMAL
Deborah
Tommy
Franco

ORDEN NINGUNO
Franco
Manuela
Tommy
Deborah
Denisse

esta es una prueba aparte que no la pondré en github pero en listado normal a partir de la 3era entrada no me muestra las otras por esto de las colisiones.

Esta es la prueba:

Código Java:
Ver original
  1. package linkedsetsimplev1;
  2. public class Cuerpo
  3. {
  4.     public static void main(String[] args) {
  5.         MySet<String>set = new MyLinkedSet();
  6.         set.add("Deborah");
  7.         set.add("Tommy");
  8.         set.add("Franco");
  9.         set.add("Manuela");
  10.         set.add("Miguel");
  11.         set.add("Denisse");
  12.         System.out.println("\t\tORDEN NORMAL");
  13.         set.stream().forEach((s) -> {
  14.             System.out.println(s);
  15.         });
  16.         System.out.println("");
  17.         MyLinkedSet<String>set2 = new MyLinkedSet();
  18.         set2.add("Franco");
  19.         set2.add("Miguel");
  20.         set2.add("Manuela");
  21.         set2.add("Tommy");        
  22.         set2.add("Deborah");
  23.         set2.add("Denisse");
  24.         System.out.println("\t\tORDEN NINGUNO");        
  25.         set2.stream().forEach((s) -> {
  26.             System.out.println(s);
  27.         });
  28.     }    
  29. }

Y no sé me ocurre nada para arreglarlo, espero sus respuestas y saludos.
  #18 (permalink)  
Antiguo 29/10/2017, 22:57
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
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.
  #19 (permalink)  
Antiguo 30/10/2017, 22:07
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: TablaHash y sus pasos

Buenas a todos, al final solucioné el problema que tenía resulta que tenía que cambiar el addEntry de MyMap y arreglarlo a esto:

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.             table = Arrays.copyOf(table, table.length * 2);
  5.             this.clear();
  6.             for (Entry<K, V> e : tmp) {    
  7.                 if(e != null){
  8.                     put(e.getKey(),e.getValue());
  9.                 }
  10.             }            
  11.         }
  12.         this.createEntry(key,value);
  13.     }

También actualice mis repositorios en github:

https://github.com/detectivejd/HassMap_casero

https://github.com/detectivejd/HashSet_casero

https://github.com/detectivejd/LinkedHashMap_casero

Ahora veré si puedo completar el LinkedHashSet, si lo logro genial y lo pongo en este medio, si falta algún test o hay que hacerle alguna corrección por favor diganlo.

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

Bueno, llegué al LinkedHashSet o bien MyLinkedSet, pero tengo el problema en las colisiones (en MyMap esta el lio de nuevo :( ) y el problema que tengo es que cuando llego ahí no puedo listar los siguientes datos:

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){ // este else if es el que me complica
  12.                     e.next = new Entry(key,value);
  13.                     e.recordAccess(this); // -> ¿pero cómo resuelvo esto?
  14.                     size++;
  15.                     return value;
  16.                 }                
  17.             }
  18.             this.addEntry(key, value);
  19.             return value;                    
  20.         } else {
  21.             return null;
  22.         }
  23.     }

y otra vez la clave está en MyMap y MyLinkedMap que ya los puse en el código, digo esto xq Mi Set Enlazado tiene esto de código:

Código Java:
Ver original
  1. package linkedsetsimplev1;
  2. import java.util.Collection;
  3. public class MyLinkedSet<E> extends MySet<E>
  4. {
  5.     public MyLinkedSet() {
  6.         super(4,true);
  7.     }
  8.     public MyLinkedSet(int xcap) {
  9.         super(xcap,true);
  10.     }
  11.     public MyLinkedSet(Collection<? extends E> c) {
  12.         super(c.size(),true);
  13.         addAll(c);
  14.     }
  15. }

Porque lo único nuevo q tiene MySet es este constructor que MyLinkedSet usa:

Código Java:
Ver original
  1. MySet(int xcap, boolean dummy) {
  2.         map = new MyLinkedMap(xcap);
  3.     }

Y les pregunto que ideas me dan para arreglar esto????

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

Buenas a todos, solucioné un poco el código y el primer listado me anda bien pero el segundo no debido por las colisiones, quedando de esta forma:

ORDEN NORMAL
Deborah
Tommy
Franco
Manuela
Miguel
Denisse

ORDEN NINGUNO
Franco
Manuela
Tommy
Deborah
Denisse

Había cambiado en Entry el poner una función llamada chain para las colisiones cosa que el Entry de MyLinkedMap solo cambie su implementación, pongo el repositorio en github para ver si dan alguna idea de que cambiar porque no se me ocurre nada.

https://github.com/detectivejd/Linke...kedsetsimplev1

Espero sus respuestas y saludos.
  #22 (permalink)  
Antiguo 28/11/2017, 02:25
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 7 meses
Puntos: 188
Respuesta: TablaHash y sus pasos

Esto lo has corregido?

else if(e.next == null){ // este else if es el que me complica
e.next = new Entry(key,value);
e.recordAccess(this); // -> ¿pero cómo resuelvo esto?
size++;
return value;
}


llamas 2 veces a e.next...
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #23 (permalink)  
Antiguo 28/11/2017, 21:05
Avatar de 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 FuzzyLog gracias por responder, verás para que me muestre como lo hace ahora sí pero para cómo debería andar no.

En el put de MyMap.java sufrió algunos cambios como este:

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

En la clase interna Entry de MyMap.java puse la función chain quedando de esta forma:

Código Java:
Ver original
  1. V chain(K key, V value){
  2.             this.next = new Entry(key,value);
  3.             size++;
  4.             return value;
  5.         }

Cosa que en Entry de MyLinkedMap.java lo pueda redefinir de esta forma:

Código Java:
Ver original
  1. @Override
  2.         Object chain(Object key, Object value) {
  3.             this.next = new Entry(key,value);
  4.             ((MyLinkedMap.Entry)this.next).addBefore(head);            
  5.             size++;
  6.             return value;
  7.         }

pero en el método main no lista los datos por órden de inserción:

Código Java:
Ver original
  1. public static void main(String[] args) {
  2.         MySet<String>set = new MyLinkedSet();
  3.         set.add("Deborah");
  4.         set.add("Tommy");
  5.         set.add("Franco");
  6.         set.add("Manuela");
  7.         set.add("Miguel");
  8.         set.add("Denisse");
  9.         System.out.println("\t\tORDEN NORMAL");
  10.         set.stream().forEach((s) -> {
  11.             System.out.println(s);
  12.         });
  13.         System.out.println("");
  14.         MyLinkedSet<String>set2 = new MyLinkedSet();
  15.         set2.add("Franco");
  16.         set2.add("Miguel"); // -> aqui tengo los problemas
  17.         set2.add("Manuela");
  18.         set2.add("Tommy");        
  19.         set2.add("Deborah");
  20.         set2.add("Denisse");
  21.         System.out.println("\t\tORDEN NINGUNO");        
  22.         set2.stream().forEach((s) -> {
  23.             System.out.println(s);
  24.         });
  25.     }

Pero tengo problemas con las colisiones, sé que me falta algo para que me ande bien el MyLinkedMap y MyLinkedSet, el código lo puse en github y no sé me ocurre nada para arreglarlo, si ven algo avisen por favor.

https://github.com/detectivejd/Linke...kedsetsimplev1

Espero sus respuestas y saludos.
  #24 (permalink)  
Antiguo 29/11/2017, 05:30
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 7 meses
Puntos: 188
Respuesta: TablaHash y sus pasos

A lo mejor tendrías que comprobar la futura cantidad de elementos a almacenar y en caso de que supere el máximo existente incrementar el tamaño del set y añadir el elemento.

En todo caso puedes hacer debug para ver dónde se te pierde el valor.
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #25 (permalink)  
Antiguo 29/11/2017, 22:34
Avatar de 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 FuzzyLog me sirvió muchísimo lo que me dijiste resulta que era ese el problema, así que hice este cambio:

Código Java:
Ver original
  1. protected void addEntry(K key, V value){
  2.         if(size >= table.length * 0.75){
  3.             Entry<K,V>[] tmp = table;
  4.             table = Arrays.copyOf(table, table.length * 2);
  5.             this.clear();
  6.             for (Entry<K, V> e : tmp) {    
  7.                 if(e != null){
  8.                     put(e.getKey(),e.getValue());
  9.                     for(;e != null; e = e.next){ // -> puse este for para que también almacene las entradas por colisiones
  10.                         put(e.getKey(),e.getValue());
  11.                     }
  12.                 }
  13.             }
  14.         }
  15.         this.createEntry(key,value);
  16.     }

Y funcionó:

run:
ORDEN NORMAL
Deborah
Tommy
Franco
Manuela
Miguel
Denisse

ORDEN NINGUNO
Franco
Miguel
Manuela
Tommy
Deborah
Denisse

Ya lo subí a github: enlace

Puede que le ponga los test que tengo hasta para ver que tal. Saludos y gracias.
  #26 (permalink)  
Antiguo 01/12/2017, 13:38
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: TablaHash y sus pasos

En el codigo que pones, en la linea 7 se chequea si e es null, y solo se ejecuta lo que esta dentro del if si e no es null.

Por lo tanto la linea 8 se ejecuta. Esa linea no cambia el valor de e, por lo que e sigue siendo distinto de null.

En la linea 9 se vuelve a comparar, en la condicion de continuacion del ciclo for, si e no es null, sabemos que no es - sino no estariamos aqui -, y se vuelve a hacer en la linea 10, lo que se hizo justo antes, en la linea 8. Parece todo repetido.

Puesto que es lo mismo, sugiero eliminar la linea 8.

Al eliminarla, quedaria el ciclo for dentro del if, pero el if chequea lo mismo que el for, entonces el if se hace superfluo.

Resumen: Elimina el if y la primera instruccion de ese if, y quedate con el ciclo for solamente.
__________________
Visita mi perfil en LinkedIn
  #27 (permalink)  
Antiguo 02/12/2017, 21:19
Avatar de 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 a todos, CalgaryCorpus que bueno es verte de nuevo, mira hice lo que me dijiste:

Código Java:
Ver original
  1. protected void addEntry(K key, V value){
  2.         if(size >= table.length * 0.75){
  3.             Entry<K,V>[] tmp = table;
  4.             table = Arrays.copyOf(table, table.length * 2);
  5.             this.clear();
  6.             for (Entry<K, V> e : tmp) {    
  7.                 for(;e != null; e = e.next){
  8.                     put(e.getKey(),e.getValue());
  9.                 }
  10.             }
  11.         }
  12.         this.createEntry(key,value);
  13.     }

Pero gracias a eso me dí cuenta que en algunos casos el código no ordena por inserción, los listados 1,2 y 4 andan pero el 3 no, y en el 3 me ordena hasta el 2do elemento que es la función reverse del test UpTest.java.

1
Deborah
Tommy
Franco
Manuela
Miguel
Denisse

2

3
Denisse
Franco
Miguel
Manuela
Deborah
Tommy

4
Deborah
Tommy
Franco
Manuela
Miguel
Denisse

Estos listados no los verás en el repositorio, pero sí la función que te dije y en dónde te dije, los Set son siempre los que me dan los problemas pero me pulen los Map.

En MyLinkedMap tengo el método init y addBefore de la clase Entry que es el que me da las ordenaciones por inserción.

Pongo el repositorio de LinkedSetSimple: https://goo.gl/g3hFwz

Espero sus respuestas y Saludos.
  #28 (permalink)  
Antiguo 03/12/2017, 01:10
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: TablaHash y sus pasos

No entiendo lo que intentas probar.
Supongo que tus tests unitarios siguen malos.

Es mejor que recortes tus problemas en pequeños problemas que entregar un link a kilómetros de código para que alguien más los encuentre por ti.

Haz uno o varios tests que usen lo más básico de los tipos que estás definiendo, alguno(s) de ellos debería(n) fallar. Corrijelo (s). Haz que ese test sea parte de tus tests para que modificaciones futuras detecten errores en implementaciones de otras funcionalidades.

Publica en este foro dudas puntuales con código pequeño.
Crea varios posts con distintas dudas. Este post no termina nunca de la forma que lo has hecho.
__________________
Visita mi perfil en LinkedIn
  #29 (permalink)  
Antiguo 04/12/2017, 22:24
Avatar de 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 Calgary Corpus, te respondo por partes

Cita:
No entiendo lo que intentas probar.
Verás gracias a tu otro comentario pude arreglar con los for, pero probando me dí cuenta que en ciertas ocasiones el LinkedHashSet casero (MyLinkedSet) no ordena por inserción de datos, en la función reverse de la clase UpTest.java porque los puse en la función en este órden:

"Denisse","Franco","Manuela","Deborah","Miguel","T ommy"

pero en la consola me muestra de esta forma:

Denisse
Franco
Miguel
Manuela
Deborah
Tommy

verás que el elemento 3, 4 y 5 no están ordenados por inserción eso es lo que quiero probar y arreglar. En la clase MyLinkedMap hereda de MyMap (como lo hace LinkedHashMap con HashMap) el método addBefore y
init son para el tema de las ordenaciones, ahí está mi problema.

Cita:
Supongo que tus tests unitarios siguen malos.
Dame una idea de cómo cambiarlos porque así estuvimos que son malos, malos y más malos pero no sé ocurrió una forma de mejorarlos sinceramente, pensé más en las funcionalidades,

Cita:
Es mejor que recortes tus problemas en pequeños problemas que entregar un link a kilómetros de código para que alguien más los encuentre por ti.
En estos momentos el problema a resolver está en el addBefore de la clase MyLinkedMap para que independiente de cómo pongas los datos, los órdenes por inserción.

Cita:
Haz uno o varios tests que usen lo más básico de los tipos que estás definiendo, alguno(s) de ellos debería(n) fallar. Corrijelo (s). Haz que ese test sea parte de tus tests para que modificaciones futuras detecten errores en implementaciones de otras funcionalidades.
Cada clase del paquete linkedsetsimple.test es un test diferente, dame ideas para mejorarlos. Con respecto a:

Cita:
Haz que ese test sea parte de tus tests para que modificaciones futuras detecten errores en implementaciones de otras funcionalidades.
Aparte de lo que hacen las estructuras de datos CRUD, no sé me ocurre otra implementación de otra funcionalidad, estas estructuras de hashing que estoy haciendo son para ver entender cómo funcionan los Hashing normales:

* HashMap
* HashSet - que delega todo de HashMap)

los Hashing enlazados, que estoy en los últimos detalles para terminarlos:

* LinkedHashMap - hereda de HashMap pero algunos métodos son redifinidos y cambian los iterators.
* LinkedHashSet - usa el 4to constructor de HashSet para usar en el Map una instancia de LinkedHashMap

y después de esto quiero intentar implementar TreeMap y TreeSet caseros, todo esto es una antesala de lo que quiero hacer pero para eso quiero entender bien los Hashing cómo se implementan y funcionan.

Pongo el repositorio, el que hay que mirar es MyMap,MyLinkedMap y MyLinkedSet, probar e ver en MyLinkedSet (en especial) el tema de las pruebas, supongo que no viste los últimos cambios de las estructuras.

https://goo.gl/g3hFwz

Espero sus respuestas y saludos
  #30 (permalink)  
Antiguo 05/12/2017, 00:36
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: TablaHash y sus pasos

No voy a revisar el codigo por ti, a menos que presentes un subconjunto limitado, en un problema puntual, en otro post. Haz tu mismo lo necesario para descubrir lo que esta mal ahora. Asi aprenderas mas.

Aqui tienes una idea:
En vez de insertar 5 o 6 elementos, inserta 2 o 3, o lo que sea, pero que sea la minima cantidad de elementos para que el problema que ves ahora se reproduzca.
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. Tal vez tu estructura esta bien, pero cuando lo imprimes, la recorres mal. O no, tal vez tu insercion es incorrecta y tu impresion esta bien. O tal vez ambos procesos estan mal.

Una vez que compruebes que' estaba mal, haz un test unitario que falle en las condiciones actuales. Una vez corregido el problema, ese test deberia pasar, junto a todos los otros.

Si este proceso te conduce a corregir algo y aparece OTRO problema, usa la misma metodologia para descubrir tus propios problemas y haz post cortos.

Abandono este thread. Te veo en otro.

Suerte.
__________________
Visita mi perfil en LinkedIn

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 22:20.