forked from Speiger/Primitive-Collections
Fixing TreeSet Removal Bugs
-Fixed: RB&AVL TreeSet Removal & Higher Bugs. -Fixed: Paths thanks to OvermindDL1 -Removed: JavaTests Class that was testing for finding the bugs.
This commit is contained in:
parent
c0c719f2b6
commit
e3bcf83887
|
@ -22,7 +22,7 @@ public class TestBuilder extends TemplateProcessor
|
||||||
|
|
||||||
public TestBuilder()
|
public TestBuilder()
|
||||||
{
|
{
|
||||||
super(Paths.get("src\\main\\resources\\speiger\\assets\\collections\\templates\\"), Paths.get("src\\main\\java\\speiger\\src\\collections\\"), Paths.get("src\\main\\resources\\speiger\\assets\\collections\\"));
|
super(Paths.get("src/main/resources/speiger/assets/collections/templates/"), Paths.get("src/main/java/speiger/src/collections/"), Paths.get("src/main/resources/speiger/assets/collections/"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -225,6 +225,32 @@ public class AVL_TREE_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Entry KEY_GENERIC_TYPE findCeilingNode(KEY_TYPE e) {
|
protected Entry KEY_GENERIC_TYPE findCeilingNode(KEY_TYPE e) {
|
||||||
|
Entry KEY_GENERIC_TYPE entry = tree;
|
||||||
|
int compare;
|
||||||
|
while(entry != null) {
|
||||||
|
if((compare = compare(e, entry.key)) < 0) {
|
||||||
|
if(entry.left == null) break;
|
||||||
|
entry = entry.left;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if(compare > 0) {
|
||||||
|
if(entry.right != null) entry = entry.right;
|
||||||
|
else {
|
||||||
|
Entry KEY_GENERIC_TYPE parent = entry.parent;
|
||||||
|
while(parent != null && parent.right == entry) {
|
||||||
|
entry = parent;
|
||||||
|
parent = parent.parent;
|
||||||
|
}
|
||||||
|
return parent;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Entry KEY_GENERIC_TYPE findHigherNode(KEY_TYPE e) {
|
||||||
Entry KEY_GENERIC_TYPE entry = tree;
|
Entry KEY_GENERIC_TYPE entry = tree;
|
||||||
while(entry != null) {
|
while(entry != null) {
|
||||||
if(compare(e, entry.key) < 0) {
|
if(compare(e, entry.key) < 0) {
|
||||||
|
@ -246,32 +272,6 @@ public class AVL_TREE_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Entry KEY_GENERIC_TYPE findHigherNode(KEY_TYPE e) {
|
|
||||||
Entry KEY_GENERIC_TYPE entry = tree;
|
|
||||||
int compare;
|
|
||||||
while(entry != null) {
|
|
||||||
if((compare = compare(e, entry.key)) < 0) {
|
|
||||||
if(entry.left == null) break;
|
|
||||||
entry = entry.left;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if(compare < 0) {
|
|
||||||
if(entry.right != null) entry = entry.right;
|
|
||||||
else {
|
|
||||||
Entry KEY_GENERIC_TYPE parent = entry.parent;
|
|
||||||
while(parent != null && parent.right == entry) {
|
|
||||||
entry = parent;
|
|
||||||
parent = parent.parent;
|
|
||||||
}
|
|
||||||
return parent;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return entry;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
@Override
|
@Override
|
||||||
public boolean contains(KEY_TYPE e) {
|
public boolean contains(KEY_TYPE e) {
|
||||||
|
|
|
@ -225,6 +225,32 @@ public class RB_TREE_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Entry KEY_GENERIC_TYPE findCeilingNode(KEY_TYPE e) {
|
protected Entry KEY_GENERIC_TYPE findCeilingNode(KEY_TYPE e) {
|
||||||
|
Entry KEY_GENERIC_TYPE entry = tree;
|
||||||
|
int compare;
|
||||||
|
while(entry != null) {
|
||||||
|
if((compare = compare(e, entry.key)) < 0) {
|
||||||
|
if(entry.left == null) break;
|
||||||
|
entry = entry.left;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if(compare > 0) {
|
||||||
|
if(entry.right != null) entry = entry.right;
|
||||||
|
else {
|
||||||
|
Entry KEY_GENERIC_TYPE parent = entry.parent;
|
||||||
|
while(parent != null && parent.right == entry) {
|
||||||
|
entry = parent;
|
||||||
|
parent = parent.parent;
|
||||||
|
}
|
||||||
|
return parent;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Entry KEY_GENERIC_TYPE findHigherNode(KEY_TYPE e) {
|
||||||
Entry KEY_GENERIC_TYPE entry = tree;
|
Entry KEY_GENERIC_TYPE entry = tree;
|
||||||
while(entry != null) {
|
while(entry != null) {
|
||||||
if(compare(e, entry.key) < 0) {
|
if(compare(e, entry.key) < 0) {
|
||||||
|
@ -246,31 +272,7 @@ public class RB_TREE_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Entry KEY_GENERIC_TYPE findHigherNode(KEY_TYPE e) {
|
|
||||||
Entry KEY_GENERIC_TYPE entry = tree;
|
|
||||||
int compare;
|
|
||||||
while(entry != null) {
|
|
||||||
if((compare = compare(e, entry.key)) < 0) {
|
|
||||||
if(entry.left == null) break;
|
|
||||||
entry = entry.left;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if(compare < 0) {
|
|
||||||
if(entry.right != null) entry = entry.right;
|
|
||||||
else {
|
|
||||||
Entry KEY_GENERIC_TYPE parent = entry.parent;
|
|
||||||
while(parent != null && parent.right == entry) {
|
|
||||||
entry = parent;
|
|
||||||
parent = parent.parent;
|
|
||||||
}
|
|
||||||
return parent;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return entry;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
@Override
|
@Override
|
||||||
|
@ -934,6 +936,7 @@ public class RB_TREE_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE
|
||||||
if(current == previous) index--;
|
if(current == previous) index--;
|
||||||
updateNext();
|
updateNext();
|
||||||
updatePrevious();
|
updatePrevious();
|
||||||
|
if(current.needsSuccessor()) next = current;
|
||||||
set.removeNode(current);
|
set.removeNode(current);
|
||||||
current = null;
|
current = null;
|
||||||
}
|
}
|
||||||
|
@ -1015,6 +1018,7 @@ public class RB_TREE_SET KEY_GENERIC_TYPE extends ABSTRACT_SET KEY_GENERIC_TYPE
|
||||||
if(current == previous) index--;
|
if(current == previous) index--;
|
||||||
updateNext();
|
updateNext();
|
||||||
updatePrevious();
|
updatePrevious();
|
||||||
|
if(current.needsSuccessor()) next = current;
|
||||||
removeNode(current);
|
removeNode(current);
|
||||||
current = null;
|
current = null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,29 +0,0 @@
|
||||||
package speiger.src.collections.ints.utils;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.TreeSet;
|
|
||||||
import java.util.stream.IntStream;
|
|
||||||
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
public class JavaTests
|
|
||||||
{
|
|
||||||
protected static final Integer[] CONTAINS_ARRAY = new Integer[]{23, 45, 63, 89, 32};
|
|
||||||
protected static final Integer[] TEST_ARRAY = IntStream.range(0, 100).mapToObj(Integer::valueOf).toArray(Integer[]::new);
|
|
||||||
|
|
||||||
private TreeSet<Integer> create(Integer[] array)
|
|
||||||
{
|
|
||||||
TreeSet<Integer> tree = new TreeSet<Integer>();
|
|
||||||
tree.addAll(Arrays.asList(array));
|
|
||||||
return tree;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void simpleTest()
|
|
||||||
{
|
|
||||||
TreeSet<Integer> collection = create(TEST_ARRAY);
|
|
||||||
Assert.assertTrue(collection.removeAll(create(CONTAINS_ARRAY)));
|
|
||||||
Assert.assertFalse(collection.removeAll(create(CONTAINS_ARRAY)));
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue