Respuesta: Balanceos con Árboles Hash Buenas noticias logré hacer andar el código pudiendo poner datos de un map a otro, tenía que arreglar el put, fixUp y el successor:
Código Java:
Ver original@Override public V put(K key, V value) { if(key != null){ Entry<K,V> t = root; if(t == null){ root = new Entry(key,value,null); size = 1; } else { Entry<K,V> parent = null; int cmp = 0; while (t != null) { parent = t; cmp = checkCompare(t,key); if(cmp < 0){ t = t.left; } else if(cmp > 0) { t = t.right; } else { return t.value = value; } } Entry<K,V> e = new Entry<>(key, value, parent); if (cmp < 0) { parent.left = e; } else { parent.right = e; } e.color = RED; fixUp(e); size++; } } return null; } private int checkCompare(Entry<K,V>x, K key){ if(comparator != null){ return comparator.compare(key,x.key); } else { Comparable<? super K> k = (Comparable<? super K>) key; return k.compareTo(x.key); } } private void fixUp(Entry<K,V> x) { while (x != null && x != root && x.parent.color == RED) { if (x.parent == x.parent.parent.left) { Entry<K,V> y = x.parent.parent.right; if (y != null && y.color == RED) { x.parent.color = BLACK; y.color = BLACK; x.parent.parent.color = RED; x = x.parent.parent; } else { if (x == x.parent.right) { x = x.parent; rotateLeft(x); } else { x.parent.color = BLACK; x.parent.parent.color = RED; rotateRight(x.parent.parent); } } } else { Entry<K,V> y = x.parent.parent.left; if (y != null && y.color == RED) { x.parent.color = BLACK; y.color = BLACK; x.parent.parent.color = RED; x = x.parent.parent; } else { if (x == x.parent.left) { x = x.parent; rotateRight(x); } else { x.parent.color = BLACK; x.parent.parent.color = RED; rotateLeft(x.parent.parent); } } } } root.color = BLACK; } /** * Do a right rotation around this node. */ private void rotateRight(Entry<K,V> p) { Entry<K,V> x = p.left; p.left = x.right; if (x.right != null) x.right.parent = p; x.parent = p.parent; x.right = p; p.right = x; if (p.parent == null) { root = (Entry)x; } else if (p == p.parent.right){ p.parent.right = x; } else { x.parent.left = x; } } /** * Do a left rotation around this node. */ private void rotateLeft(Entry<K,V> p) { Entry<K,V> y = p.right; p.right = y.left; if (y.left != null) y.left.parent = p; y.parent = p.parent; if (p.parent == null) { root = (Entry)y; } else if (p == p.parent.left) { p.parent.left = y; } else { p.parent.right = y; } y.left = p; p.parent = y; } //copié el successor de Oracle, claro está private Entry<K,V> successor(Entry<K,V> t) { if (t == null) return null; else if (t.right != null) { Entry<K,V> p = t.right; while (p.left != null) p = p.left; return p; } else { Entry<K,V> p = t.parent; Entry<K,V> ch = t; while (p != null && ch == p.right) { ch = p; p = p.parent; } return p; } }
Y los test de inserción simple, inserción con clases, y defiendo el órden por las claves de forma creciente andan, pero cuando quiero que me los inserte ordenados por las claves de forma decreciente no andan bien, me hace esto: Cita: ---- prueba 4 ----
tamaño: 10
[10 -> Persona{10, Nombre: Micaela, Edad: 21}]
[9 -> Persona{9, Nombre: Tommy, Edad: 22}]
[8 -> Persona{8, Nombre: Nelson, Edad: 37}]
[7 -> Persona{7, Nombre: Deborah, Edad: 26}]
[10 -> Persona{10, Nombre: Micaela, Edad: 21}]
[9 -> Persona{9, Nombre: Tommy, Edad: 22}]
[8 -> Persona{8, Nombre: Nelson, Edad: 37}]
[7 -> Persona{7, Nombre: Deborah, Edad: 26}]
[10 -> Persona{10, Nombre: Micaela, Edad: 21}]
[9 -> Persona{9, Nombre: Tommy, Edad: 22}]
[8 -> Persona{8, Nombre: Nelson, Edad: 37}]
[7 -> Persona{7, Nombre: Deborah, Edad: 26}]
[10 -> Persona{10, Nombre: Micaela, Edad: 21}]
[9 -> Persona{9, Nombre: Tommy, Edad: 22}]
[8 -> Persona{8, Nombre: Nelson, Edad: 37}]
[7 -> Persona{7, Nombre: Deborah, Edad: 26}]
[10 -> Persona{10, Nombre: Micaela, Edad: 21}]
[9 -> Persona{9, Nombre: Tommy, Edad: 22}]
[8 -> Persona{8, Nombre: Nelson, Edad: 37}]
[7 -> Persona{7, Nombre: Deborah, Edad: 26}]
[10 -> Persona{10, Nombre: Micaela, Edad: 21}]
[9 -> Persona{9, Nombre: Tommy, Edad: 22}]
[8 -> Persona{8, Nombre: Nelson, Edad: 37}]
[7 -> Persona{7, Nombre: Deborah, Edad: 26}]
[10 -> Persona{10, Nombre: Micaela, Edad: 21}]
[9 -> Persona{9, Nombre: Tommy, Edad: 22}]
[8 -> Persona{8, Nombre: Nelson, Edad: 37}]
[7 -> Persona{7, Nombre: Deborah, Edad: 26}]
[10 -> Persona{10, Nombre: Micaela, Edad: 21}]
[9 -> Persona{9, Nombre: Tommy, Edad: 22}]
[8 -> Persona{8, Nombre: Nelson, Edad: 37}]
[7 -> Persona{7, Nombre: Deborah, Edad: 26}]
[10 -> Persona{10, Nombre: Micaela, Edad: 21}]
[9 -> Persona{9, Nombre: Tommy, Edad: 22}]
[8 -> Persona{8, Nombre: Nelson, Edad: 37}]
[7 -> Persona{7, Nombre: Deborah, Edad: 26}]
[10 -> Persona{10, Nombre: Micaela, Edad: 21}]
[9 -> Persona{9, Nombre: Tommy, Edad: 22}]
[8 -> Persona{8, Nombre: Nelson, Edad: 37}]
[7 -> Persona{7, Nombre: Deborah, Edad: 26}]
[10 -> Persona{10, Nombre: Micaela, Edad: 21}]
[9 -> Persona{9, Nombre: Tommy, Edad: 22}]
[8 -> Persona{8, Nombre: Nelson, Edad: 37}]
[7 -> Persona{7, Nombre: Deborah, Edad: 26}]
[10 -> Persona{10, Nombre: Micaela, Edad: 21}]
[9 -> Persona{9, Nombre: Tommy, Edad: 22}]
[8 -> Persona{8, Nombre: Nelson, Edad: 37}]
[7 -> Persona{7, Nombre: Deborah, Edad: 26}]
................ El código es prueba es este:
Código Java:
Ver originalprivate static void insertWithClassOrderDesc(){ Persona.resetId(); MyTreeMap <Integer,Persona > map = new MyTreeMap (new OrdenarDesc ()); Persona p1 = new Persona(Persona.getMaxId(), "Juan", 56); Persona.maxIdUp(); Persona p2 = new Persona(Persona.getMaxId(), "Alberto", 73); Persona.maxIdUp(); Persona p3 = new Persona(Persona.getMaxId(), "Julia", 62); Persona.maxIdUp(); Persona p4 = new Persona(Persona.getMaxId(), "Luis", 71); Persona.maxIdUp(); Persona p5 = new Persona(Persona.getMaxId(), "Maria", 18); Persona.maxIdUp(); Persona p6 = new Persona(Persona.getMaxId(), "Pedro", 16); Persona.maxIdUp(); Persona p7 = new Persona(Persona.getMaxId(), "Deborah", 26); Persona.maxIdUp(); Persona p8 = new Persona(Persona.getMaxId(), "Nelson", 37); Persona.maxIdUp(); Persona p9 = new Persona(Persona.getMaxId(), "Tommy", 22); Persona.maxIdUp(); Persona p10 = new Persona(Persona.getMaxId(), "Manuela", 15); Persona.maxIdUp(); map.put(p1.getId(), p1); map.put(p2.getId(), p2); map.put(p3.getId(), p3); map.put(p4.getId(), p4); map.put(p5.getId(), p5); map.put(p6.getId(), p6); map.put(p7.getId(), p7); map.put(p8.getId(), p8); map.put(p9.getId(), p9); map.put(p10.getId(), p10); map.put(10, new Persona(10, "Micaela", 21)); map.put(6, new Persona(6, "Sergio", 25)); map.put(null, new Persona(11, "Sefafin", 7)); System. out. println("---- prueba 4 ----"); System. out. println("tamaño: " + map. size() + "\n"); map.entrySet().forEach((e)->{ }); //System.out.println(map); }
Espero sus respuestas y saludos.
__________________ Si te interesa, visita mi perfil de Linkedin. Gracias |