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

[SOLUCIONADO] Balanceos con Árboles Set

Estas en el tema de Balanceos con Árboles Set en el foro de Java en Foros del Web. Hola a todos, este post en sí es una continuación de este: Balanceos con Árboles Hash Resulta que estuve probando las funcionalidades básicas y funcionan ...
  #1 (permalink)  
Antiguo 19/10/2018, 21:01
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 12 años, 11 meses
Puntos: 6
Balanceos con Árboles Set

Hola a todos, este post en sí es una continuación de este: Balanceos con Árboles Hash

Resulta que estuve probando las funcionalidades básicas y funcionan pero el problema está cuando quiero probar la implementación delegada de los mismas pero pasa esto, si en MyTreeSet en la función iterator pongo esto:

Código Java:
Ver original
  1. @Override
  2.     public Iterator<E> iterator() {
  3.         return map.navigableKeySet().iterator();
  4.         //return map.keySet().iterator();
  5.     }

Sucede esto:

Cita:
---* Segundo Testing: probando subsets ascending---

--- Probando subSet MyTreeSet---
subSet [Deborah:Franco]: [Deborah, Franco, Manuela, Tomás]
subSet [Franco:Tomás]: [Deborah, Franco, Manuela, Tomás]
subSet [Deborah:nulo]: [Deborah, Franco, Manuela, Tomás]
subSet [nulo:Tomás]: [Deborah, Franco, Manuela, Tomás]
subSet [nulo:nulo]: []
--- Probando subSet TreeSet---
subSet [Deborah:Franco]: [Deborah]
subSet [Franco:Tomás]: [Franco, Manuela]
--- Probando headSet MyTreeSet---
headSet [Deborah]: []
headSet [Franco]: []
headSet [Manuela]: []
headSet [Tomás]: []
--- Probando headSet TreeSet---
headSet [Deborah]: []
headSet [Franco]: [Deborah]
headSet [Manuela]: [Deborah, Franco]
headSet [Tomás]: [Deborah, Franco, Manuela]
Pero cuando pongo de ésta forma:

Código Java:
Ver original
  1. @Override
  2.     public Iterator<E> iterator() {
  3.         //return map.navigableKeySet().iterator();
  4.         return map.keySet().iterator();
  5.     }

El subset funciona pero los headset y tailset no, cómo lo pueden ver:

Cita:
---* Segundo Testing: probando subsets ascending---

--- Probando subSet MyTreeSet---
subSet [Deborah:Franco]: [Deborah]
subSet [Franco:Tomás]: [Franco, Manuela]
subSet [Deborah:nulo]: [Deborah, Franco, Manuela]
subSet [nulo:Tomás]: [Deborah, Franco, Manuela]
subSet [nulo:nulo]: []
--- Probando subSet TreeSet---
subSet [Deborah:Franco]: [Deborah]
subSet [Franco:Tomás]: [Franco, Manuela]
--- Probando headSet MyTreeSet---
headSet [Deborah]: []
headSet [Franco]: []
headSet [Manuela]: []
headSet [Tomás]: []
--- Probando headSet TreeSet---
headSet [Deborah]: []
headSet [Franco]: [Deborah]
headSet [Manuela]: [Deborah, Franco]
headSet [Tomás]: [Deborah, Franco, Manuela]
Revisé, depuré pero no doy bien con el problema y menos con la solución. Aquí está el código:

https://github.com/detectivejd/TreeS...MyTreeSet.java

Espero sus respustas y saludos.

PD: Una vez que se solucione estas fallas, los test que ven en el repositorio, desaparecerán.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias
  #2 (permalink)  
Antiguo 21/10/2018, 11:23
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 9 meses
Puntos: 61
Respuesta: Balanceos con Árboles Set

Si cambias la implementacion interna y no te sirve el resultado, esta mal lo que estas usando o como lo estas usando?

Sugiero que tests unitarios apoyen el comportamiento que esperas de las estructuras que estas usando.

He visto tus tests y no se que es lo que esperan, pues es solo imprimir cosas, asi no se hacen los tests.
Los tests tienen que ser MINIMOS, PROBAR 1 SOLA COSA, y detectar ellos mismos si el test pasa o falla.
Cada vez que ejecutas tus tests ellos mismos te tienen que decir que cosa funciona bien y que falla,
o mejor aun, solo los que fallan tienen que decir algo. Asi es facil y rapido iterar.
Tambien ayuda a quien quiere usar tu estructura a saber como usarla y como la has probado.

No puede ser que todas las veces tengas que leer todo para saber que es lo que esta funcionando y que es lo que falla.

Asi lo haces ahora. En mi forma de ver, no te ayuda. Estas solo imprimiendo cosas y quien sabe que.

Parte mejorando tus tests, describe mejor tus problemas. Disminuye el tamano de tus tests hasta hacerlos fallar con pocos datos. Si insertas 10 cosas y falla, falla tambien con 5 cosas? con 3? con 2? Tu test deberia tener el caso mas basico de falla, para que puedas depurarlo. Una vez que este pase, entonces lo haces mas complejo, si es que parece adecuado. Una vez que un test pasa, NO LO BORRAS. Lo dejas alli para que cualquier modificacion futura que este incorrecta, sea descubierta por esos tests.

Haz que ayudarte sea facil, mejora tus tests de lo que haces y de lo que usas.
No publiques nuevamente de la manera que lo estas haciendo. Asi, es imposible, o muy largo ayudarte.

Haz el trabajo que te corresponde antes de pedir ayuda, recortando el problema de modo que sea simple de explicar, facil de reproducir, incluso llega al punto de modificar tu implementacion, con la idea de recortar lo que hace, solo para poder tener el programa minimo que falla.

El camino de los tests unitarios te va a ayudar a ti cuando desarrollas, cuando modificas y cuando tienes que pedir ayuda.
__________________
Visita mi perfil en LinkedIn
  #3 (permalink)  
Antiguo 22/10/2018, 20:45
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 12 años, 11 meses
Puntos: 6
Respuesta: Balanceos con Árboles Set

Hola CalgaryCorpus gracias por responder.

Cita:
Si cambias la implementacion interna y no te sirve el resultado, esta mal lo que estas usando o como lo estas usando?
Resulta que fallaba la forma en que lo estaba usando lo que tenía que hacer era la clase interna KeySet estática y en la función navigableKeySet de NavigableSubMap debía retornar una nueva instancia de KeySet pasándole el map que usaba la clase navigable.

Cita:
Sugiero que tests unitarios apoyen el comportamiento que esperas de las estructuras que estas usando. .......
Resulta que lo que viste mi idea en un principio era comparar el TreeSet casero con el TreeSet original, y si lo que hacía el casero era igual al original me daría cuenta de que está bien. De hecho ese test lo puse porque no me daba cuenta del error ya que es algo mío para luego hacer los test que debería. Pongo el código:

https://github.com/detectivejd/TreeS.../treesetsimple

Espero sus respuestas y saludos.

NOTA: El código sufrirá mucho en especial Cuerpo.java, el resto se mantiene.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias
  #4 (permalink)  
Antiguo 25/10/2018, 20:42
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 12 años, 11 meses
Puntos: 6
Respuesta: Balanceos con Árboles Set

Hola a todos, acá subí los testeos que hice del TreeSet casero, resulta que tengo el siguiente error:

Cita:
java.lang.Exception
at treesetsimple.test.Test.comprobar_que(Test.java:6)
at treesetsimple.test.DownTest.probando_borrado(DownT est.java:36)
at treesetsimple.test.DownTest.test(DownTest.java:44)
at treesetsimple.interfaz.Cuerpo.main(Cuerpo.java:13)
Lo que no me doy cuenta es dónde está la falla del remove de MyTreeMap porque el primer elemento que quiero borrar lo borra pero el siguiente no, sacando el del error funciona bien, en la línea 43 de la clase DownTest.java por alguna razón no me borra Franco:

Código Java:
Ver original
  1. probando_borrado(restart(), new Object[]{"Deborah","Franco","Denisse"});

Este es el remove de MyTreeSet (en las líneas 52, 53 y 54) que delega de MyTreeMap:

Código Java:
Ver original
  1. @Override
  2.     public boolean remove(Object o) {
  3.         return map.remove(o) == PRESENT;
  4.     }

Es el remove de MyTreeMap.java dónde supuestamente estaría el error:

Código Java:
Ver original
  1. @Override
  2.     public V remove(Object key) {
  3.         Entry<K,V> p = getEntry(key);
  4.         if (p == null) {
  5.             return null;
  6.         } else {
  7.             V oldValue = p.value;
  8.             deleteEntry(p);            
  9.             return oldValue;
  10.         }
  11.     }
  12. @Override
  13. private void deleteEntry(Entry<K,V> p) {
  14.         size--;
  15.         Entry<K,V> tmp = new Entry();
  16.         Entry<K,V> y = (leftOf(p) == null || rightOf(p) == null) ? p : higherEntry(p.getKey());
  17.         Entry<K,V> x = (leftOf(y) != null) ? leftOf(y) : (rightOf(y) != null ? rightOf(y) : tmp);        
  18.         x.parent = parentOf(y);
  19.         if (parentOf(y) == null) {
  20.             root = (x == tmp ? null : x);
  21.         } else {
  22.             if (y == leftOf(parentOf(y))) {
  23.                 y.parent.left = (x == tmp) ? null : x;
  24.             } else {
  25.                 y.parent.right = (x == tmp) ? null : x;
  26.             }
  27.         }
  28.         if (y != p){
  29.             p = y;
  30.         }
  31.         if (colorOf(y) == BLACK) {
  32.             fixDown(x);
  33.         }
  34.     }
  35. private void fixDown(Entry<K,V>x){
  36.         while(x != root && colorOf(x) == BLACK) {
  37.             if(x == parentOf(leftOf(x))) {                
  38.                 Entry<K,V> sib = parentOf(rightOf(x));
  39.                 if(colorOf(sib) == RED) {
  40.                     setColor(sib, BLACK);
  41.                     setColor(parentOf(x), RED);
  42.                     rotateLeft(x.parent);
  43.                     sib = parentOf(rightOf(x));
  44.                 }
  45.                 if(colorOf(leftOf(sib)) == BLACK && colorOf(rightOf(sib)) == BLACK) {
  46.                     setColor(sib, RED);
  47.                     x = parentOf(x);
  48.                 } else {
  49.                     if(colorOf(rightOf(sib)) == BLACK) {
  50.                         setColor(leftOf(sib), BLACK);
  51.                         setColor(sib, RED);
  52.                         rotateRight(sib);
  53.                         sib = rightOf(parentOf(x));
  54.                     }
  55.                     setColor(sib, colorOf(parentOf(x)));
  56.                     setColor(parentOf(x), BLACK);
  57.                     setColor(rightOf(sib), BLACK);
  58.                     rotateLeft(x.parent);
  59.                     x = root;
  60.                 }
  61.             } else {
  62.                 Entry<K,V> sib = leftOf(parentOf(x));                
  63.                 if(colorOf(sib) == RED) {
  64.                     setColor(sib, BLACK);
  65.                     setColor(parentOf(x), RED);
  66.                     rotateRight(x.parent);
  67.                     sib = leftOf(parentOf(x));
  68.                 }
  69.                 if(colorOf(rightOf(sib)) == BLACK && colorOf(leftOf(sib)) == BLACK){
  70.                     setColor(sib, RED);
  71.                     x = parentOf(x);
  72.                 } else {                    
  73.                     if(colorOf(leftOf(sib)) == BLACK) {
  74.                         setColor(rightOf(sib), BLACK);
  75.                         setColor(sib, RED);
  76.                         rotateLeft(sib);                        
  77.                         sib = leftOf(parentOf(x));
  78.                     }
  79.                     setColor(sib, colorOf(parentOf(x)));
  80.                     setColor(parentOf(x), BLACK);
  81.                     setColor(leftOf(sib), BLACK);
  82.                     rotateRight(x.parent);
  83.                     x = root;
  84.                 }
  85.             }
  86.         }
  87.         setColor(x, BLACK);
  88.     }

Espero sus respuestas y saludos.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias
  #5 (permalink)  
Antiguo 26/10/2018, 09:33
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 9 meses
Puntos: 61
Respuesta: Balanceos con Árboles Set

Crea un post nuevo por cada problema. No parece difícil de entender.

Deja de hacer post infinitos que nunca se cierran y que sólo te sirven a ti.
Varios temas pueden servirle a otros, te forzará a poner un nombre distinto, relacionado con.el problema.

Ojalá que todo aquel que quiera ayudarte exija lo mismo, para ayudar a este foro a sobrevivir.
__________________
Visita mi perfil en LinkedIn
  #6 (permalink)  
Antiguo 26/10/2018, 11:44
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 12 años, 11 meses
Puntos: 6
Respuesta: Balanceos con Árboles Set

Hola CalgaryCorpus gracias por responder, de hecho lo que acabo de escribir es lo que queda por hacer después ya no más. Bueno, haré otro post con el título "problema al borrar en árbol set casero".
Había puesto ese título porque era interesante.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias
  #7 (permalink)  
Antiguo 26/10/2018, 11:54
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 12 años, 11 meses
Puntos: 6
Respuesta: Balanceos con Árboles Set

Bueno aquí esta el post que había dicho -> Problema al borrar en árbol Set casero

Espero sus respuestas y saludos.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias

Etiquetas: post, set
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 00:33.