From 32ff2eeece956254cb8d3bb60f7d1526571ac28c Mon Sep 17 00:00:00 2001 From: bculkin2442 Date: Sun, 26 Feb 2017 08:24:02 -0500 Subject: Update --- .../main/java/bjc/utils/data/SingleIterator.java | 25 +++++++ .../bjc/utils/data/TopDownTransformIterator.java | 79 +++++++++++++++------- BJC-Utils2/src/main/java/bjc/utils/data/Tree.java | 21 +++--- 3 files changed, 93 insertions(+), 32 deletions(-) create mode 100644 BJC-Utils2/src/main/java/bjc/utils/data/SingleIterator.java (limited to 'BJC-Utils2/src/main') diff --git a/BJC-Utils2/src/main/java/bjc/utils/data/SingleIterator.java b/BJC-Utils2/src/main/java/bjc/utils/data/SingleIterator.java new file mode 100644 index 0000000..fde1197 --- /dev/null +++ b/BJC-Utils2/src/main/java/bjc/utils/data/SingleIterator.java @@ -0,0 +1,25 @@ +package bjc.utils.data; + +import java.util.Iterator; + +public class SingleIterator implements Iterator { + private T itm; + + private boolean yielded; + + public SingleIterator(T item) { + itm = item; + + yielded = false; + } + + public boolean hasNext() { + return !yielded; + } + + public T next() { + yielded = true; + + return itm; + } +} diff --git a/BJC-Utils2/src/main/java/bjc/utils/data/TopDownTransformIterator.java b/BJC-Utils2/src/main/java/bjc/utils/data/TopDownTransformIterator.java index 4c5ec8a..d37123f 100644 --- a/BJC-Utils2/src/main/java/bjc/utils/data/TopDownTransformIterator.java +++ b/BJC-Utils2/src/main/java/bjc/utils/data/TopDownTransformIterator.java @@ -58,9 +58,48 @@ public class TopDownTransformIterator implements Iterator flushYields(ITree val) { + if(curYield != null) { + toYield.add(new SingleIterator<>(val)); + + if(curYield.hasNext()) { + return curYield.next(); + } else { + while(toYield.size() != 0 && !curYield.hasNext()) { + curYield = toYield.pop(); + } + + if(toYield.size() == 0 && !curYield.hasNext()) { + curYield = null; + return val; + } else { + return curYield.next(); + } + } + } else { + return val; + } + } + public ITree next() { if(done) throw new NoSuchElementException(); + if(curYield != null) { + if(curYield.hasNext()) { + return curYield.next(); + } else { + while(toYield.size() != 0 && !curYield.hasNext()) { + curYield = toYield.pop(); + } + + if(toYield.size() == 0 && !curYield.hasNext()) { + curYield = null; + } else { + return curYield.next(); + } + } + } + if(initial) { TopDownTransformResult res = picker.apply(preParent.getHead()); @@ -77,17 +116,17 @@ public class TopDownTransformIterator implements Iterator implements Iterator(preParent.getHead()), this::addYield); + return flushYields(transform.apply(new Tree<>(preParent.getHead()), this::addYield)); } case PULLUP: ITree intRes = transform.apply(preParent, this::addYield); @@ -114,7 +153,7 @@ public class TopDownTransformIterator implements Iterator implements Iterator(picker, transform, preChildren.pop()); ITree res = curChild.next(); + System.out.println("\t\tTRACE: adding node " + res + " to children"); postChildren.add(res); - return res; + return flushYields(res); } else { ITree res = null; if(postParent == null) { res = new Tree<>(preParent.getHead()); + System.out.println("\t\tTRACE: adding nodes " + postChildren + " to " + res); + for(ITree child : postChildren) { res.addChild(child); } - - res = transform.apply(res, this::addYield); + + // res = transform.apply(res, this::addYield); } else { res = postParent; + System.out.println("\t\tTRACE: adding nodes " + postChildren + " to " + res); for(ITree child : postChildren) { res.addChild(child); } } done = true; - return res; + return flushYields(res); } } else { ITree res = curChild.next(); + System.out.println("\t\tTRACE: adding node " + res + " to children"); postChildren.add(res); - return res; + return flushYields(res); } } } diff --git a/BJC-Utils2/src/main/java/bjc/utils/data/Tree.java b/BJC-Utils2/src/main/java/bjc/utils/data/Tree.java index 757ffae..9018347 100644 --- a/BJC-Utils2/src/main/java/bjc/utils/data/Tree.java +++ b/BJC-Utils2/src/main/java/bjc/utils/data/Tree.java @@ -24,6 +24,9 @@ public class Tree implements ITree { private boolean hasChildren; private int childCount = 0; + private int ID; + private static int nextID = 0; + /** * Create a new leaf node in a tree * @@ -34,6 +37,8 @@ public class Tree implements ITree { data = leaf; hasChildren = false; + + ID = nextID++; } /** @@ -45,9 +50,7 @@ public class Tree implements ITree { * A list of children for this node */ public Tree(ContainedType leaf, IList> childrn) { - data = leaf; - - hasChildren = true; + this(leaf); childCount = childrn.getSize(); @@ -64,7 +67,7 @@ public class Tree implements ITree { */ @SafeVarargs public Tree(ContainedType leaf, ITree... childrn) { - data = leaf; + this(leaf); hasChildren = true; @@ -143,17 +146,19 @@ public class Tree implements ITree { } protected void internalToString(StringBuilder builder, int indentLevel, boolean initial) { - if (!initial) { - StringUtils.indentNLevels(builder, indentLevel); + for(int i = 0; i < indentLevel; i++) { + builder.append(">\t"); } - builder.append("Node: "); + builder.append("Node #"); + builder.append(ID); + builder.append(": "); builder.append(data == null ? "(null)" : data.toString()); builder.append("\n"); if (hasChildren) { children.forEach((child) -> { - ((Tree) child).internalToString(builder, indentLevel + 2, false); + ((Tree) child).internalToString(builder, indentLevel+1, false); }); } } -- cgit v1.2.3