diff --git a/src/main/java/net/abhinavsarkar/algorist/AVLTree.java b/src/main/java/net/abhinavsarkar/algorist/AVLTree.java index 62c58d1..ff4a5af 100644 --- a/src/main/java/net/abhinavsarkar/algorist/AVLTree.java +++ b/src/main/java/net/abhinavsarkar/algorist/AVLTree.java @@ -6,7 +6,7 @@ import java.util.NoSuchElementException; import java.util.Optional; import java.util.Stack; -public class AVLTree,V> implements Iterable> +public class AVLTree,V> implements SortedMap { private Node root; @@ -14,30 +14,37 @@ public class AVLTree,V> implements Iterable get(K key) { return this.root.get(key); } - public void delete(K key) { + @Override + public void remove(K key) { this.root = this.root.delete(key); } + @Override public Optional minimum() { return this.root.minimum(); } + @Override public Optional maximum() { return this.root.maximum(); } + @Override public Optional successor(K key) { return this.root.successor(key); } + @Override public Optional predecessor(K key) { return this.root.predecessor(key); } @@ -462,30 +469,6 @@ public class AVLTree,V> implements Iterable { - private final K key; - private final V val; - - public Entry(K key, V val) { - this.key = key; - this.val = val; - } - - public K getKey() - { - return key; - } - - public V getVal() - { - return val; - } - - public String toString() { - return "<" + key + "," + val + ">"; - } - } - private static class InOrderIterator, V> implements Iterator> { private final Stack> stack = new Stack<>(); @@ -542,32 +525,32 @@ public class AVLTree,V> implements Iterable bst = new AVLTree<>(true); - bst.insert("a", "barista"); - bst.insert("b", "duck"); - bst.insert("c", "carpool"); - bst.insert("d", "duck"); - bst.insert("e", "carpool"); - bst.insert("f", "barista"); - bst.insert("g", "duck"); - bst.insert("h", "abhinav"); - bst.insert("i", "abhinav"); - bst.insert("j", "duck"); - bst.insert("k", "carpool"); - bst.insert("l", "carpool"); - bst.insert("m", "abhinav"); - bst.insert("n", "duck"); - bst.insert("o", "abhinav"); - bst.insert("p", "abhinav"); - bst.insert("q", "carpool"); - bst.insert("r", "barista"); - bst.insert("s", "duck"); - bst.insert("t", "barista"); - bst.insert("u", "carpool"); - bst.insert("v", "abhinav"); - bst.insert("w", "duck"); - bst.insert("x", "barista"); - bst.insert("y", "barista"); - bst.insert("z", "duck"); + bst.put("a", "barista"); + bst.put("b", "duck"); + bst.put("c", "carpool"); + bst.put("d", "duck"); + bst.put("e", "carpool"); + bst.put("f", "barista"); + bst.put("g", "duck"); + bst.put("h", "abhinav"); + bst.put("i", "abhinav"); + bst.put("j", "duck"); + bst.put("k", "carpool"); + bst.put("l", "carpool"); + bst.put("m", "abhinav"); + bst.put("n", "duck"); + bst.put("o", "abhinav"); + bst.put("p", "abhinav"); + bst.put("q", "carpool"); + bst.put("r", "barista"); + bst.put("s", "duck"); + bst.put("t", "barista"); + bst.put("u", "carpool"); + bst.put("v", "abhinav"); + bst.put("w", "duck"); + bst.put("x", "barista"); + bst.put("y", "barista"); + bst.put("z", "duck"); System.out.println(bst); System.out.println(bst.root.checkIfBST()); @@ -580,16 +563,16 @@ public class AVLTree,V> implements Iterable,V> implements Iterable entry: bst) { - System.out.println(entry.key); + System.out.println(entry.getKey()); } } } diff --git a/src/main/java/net/abhinavsarkar/algorist/BinarySearchTree.java b/src/main/java/net/abhinavsarkar/algorist/BinarySearchTree.java index 0cb74a0..8a7a0b3 100644 --- a/src/main/java/net/abhinavsarkar/algorist/BinarySearchTree.java +++ b/src/main/java/net/abhinavsarkar/algorist/BinarySearchTree.java @@ -6,11 +6,11 @@ import java.util.NoSuchElementException; import java.util.Optional; import java.util.Stack; -public class BinarySearchTree,V> implements Iterable> +public class BinarySearchTree,V> implements SortedMap { private Node root = EmptyNode.instance(); - public void insert(K key, V val) { + public void put(K key, V val) { this.root = this.root.insert(key, val); } @@ -18,7 +18,7 @@ public class BinarySearchTree,V> implements Iterable,V> implements Iterable { - private K key; - private V val; - - public Entry(K key, V val) { - this.key = key; - this.val = val; - } - - public K getKey() - { - return key; - } - - public V getVal() - { - return val; - } - - public String toString() { - return "<" + key + "," + val + ">"; - } - } - private static class InOrderIterator, V> implements Iterator> { private final Stack> stack = new Stack<>(); @@ -481,32 +457,32 @@ public class BinarySearchTree,V> implements Iterable bst = new BinarySearchTree<>(); - bst.insert("q", "barista"); - bst.insert("y", "duck"); - bst.insert("k", "carpool"); - bst.insert("p", "duck"); - bst.insert("c", "carpool"); - bst.insert("e", "barista"); - bst.insert("d", "duck"); - bst.insert("f", "abhinav"); - bst.insert("j", "abhinav"); - bst.insert("t", "duck"); - bst.insert("s", "carpool"); - bst.insert("g", "carpool"); - bst.insert("v", "abhinav"); - bst.insert("h", "duck"); - bst.insert("r", "abhinav"); - bst.insert("n", "abhinav"); - bst.insert("w", "carpool"); - bst.insert("u", "barista"); - bst.insert("z", "duck"); - bst.insert("b", "barista"); - bst.insert("o", "carpool"); - bst.insert("a", "abhinav"); - bst.insert("l", "duck"); - bst.insert("m", "barista"); - bst.insert("i", "barista"); - bst.insert("x", "duck"); + bst.put("q", "barista"); + bst.put("y", "duck"); + bst.put("k", "carpool"); + bst.put("p", "duck"); + bst.put("c", "carpool"); + bst.put("e", "barista"); + bst.put("d", "duck"); + bst.put("f", "abhinav"); + bst.put("j", "abhinav"); + bst.put("t", "duck"); + bst.put("s", "carpool"); + bst.put("g", "carpool"); + bst.put("v", "abhinav"); + bst.put("h", "duck"); + bst.put("r", "abhinav"); + bst.put("n", "abhinav"); + bst.put("w", "carpool"); + bst.put("u", "barista"); + bst.put("z", "duck"); + bst.put("b", "barista"); + bst.put("o", "carpool"); + bst.put("a", "abhinav"); + bst.put("l", "duck"); + bst.put("m", "barista"); + bst.put("i", "barista"); + bst.put("x", "duck"); System.out.println(bst); System.out.println(bst.root.checkIfBST()); @@ -518,9 +494,9 @@ public class BinarySearchTree,V> implements Iterable,V> implements Iterable entry: bst) { - System.out.println(entry.key); + System.out.println(entry.getKey()); } } } diff --git a/src/main/java/net/abhinavsarkar/algorist/LRWCache.java b/src/main/java/net/abhinavsarkar/algorist/LRWCache.java index 918d1da..b4c46a8 100644 --- a/src/main/java/net/abhinavsarkar/algorist/LRWCache.java +++ b/src/main/java/net/abhinavsarkar/algorist/LRWCache.java @@ -25,7 +25,7 @@ public class LRWCache implements Iterable public void put(K key, V val) { store.put(key, val); if (store.size() > capacity) { - store.remove(store.iterator().next().key()); + store.remove(store.iterator().next().getKey()); } } @@ -38,7 +38,7 @@ public class LRWCache implements Iterable { return new Iterator() { - private final Iterator> it = store.iterator(); + private final Iterator> it = store.iterator(); @Override public boolean hasNext() @@ -49,7 +49,7 @@ public class LRWCache implements Iterable @Override public K next() { - return it.next().key(); + return it.next().getKey(); } }; } diff --git a/src/main/java/net/abhinavsarkar/algorist/Map.java b/src/main/java/net/abhinavsarkar/algorist/Map.java new file mode 100644 index 0000000..4951835 --- /dev/null +++ b/src/main/java/net/abhinavsarkar/algorist/Map.java @@ -0,0 +1,36 @@ +package net.abhinavsarkar.algorist; + +import java.util.Optional; + +public interface Map extends Iterable> +{ + void put(K key, V val); + + Optional get(K key); + + void remove(K key); + + class Entry { + private final K2 key; + private final V2 val; + + public Entry(K2 key, V2 val) { + this.key = key; + this.val = val; + } + + public K2 getKey() + { + return key; + } + + public V2 getVal() + { + return val; + } + + public String toString() { + return "<" + key + "," + val + ">"; + } + } +} diff --git a/src/main/java/net/abhinavsarkar/algorist/OpenAddressingHashTable.java b/src/main/java/net/abhinavsarkar/algorist/OpenAddressingHashTable.java index 9f2c760..6a5666b 100644 --- a/src/main/java/net/abhinavsarkar/algorist/OpenAddressingHashTable.java +++ b/src/main/java/net/abhinavsarkar/algorist/OpenAddressingHashTable.java @@ -4,7 +4,7 @@ import java.util.Iterator; import java.util.NoSuchElementException; import java.util.Optional; -public class OpenAddressingHashTable implements Iterable> +public class OpenAddressingHashTable implements Map { private static final Entry REMOVED = new Entry(0,0); @@ -40,6 +40,7 @@ public class OpenAddressingHashTable implements Iterable get(K key) { int trial = 0; int baseIndex = calcIndex(key, store.length); @@ -55,19 +56,20 @@ public class OpenAddressingHashTable implements Iterable= loadFactor * store.length) { resize(); @@ -77,8 +79,9 @@ public class OpenAddressingHashTable implements Iterable entry : this) + for (LinkedHashTableIterator iterator = new LinkedHashTableIterator(); iterator.hasNext();) { + Entry entry = iterator.next(); doPut(entry, nStore, true); } store = nStore; @@ -87,7 +90,7 @@ public class OpenAddressingHashTable implements Iterable nEntry, Object[] store, boolean resize) { int trial = 0; - int baseIndex = calcIndex(nEntry.key, store.length); + int baseIndex = calcIndex(nEntry.getKey(), store.length); while (trial < store.length) { int index = probingStrategy.nextIndex(baseIndex, trial, store.length); Entry entry = (Entry) store[index]; @@ -105,12 +108,14 @@ public class OpenAddressingHashTable implements Iterable implements Iterable implements Iterable implements Iterable> iterator() { + public Iterator> iterator() { return new LinkedHashTableIterator(); } public String toString() { StringBuilder sb = new StringBuilder(); - for (Entry entry : this) + for (LinkedHashTableIterator iterator = new LinkedHashTableIterator(); iterator.hasNext();) { + Entry entry = iterator.next(); sb.append(entry + ", "); } @@ -232,27 +239,12 @@ public class OpenAddressingHashTable implements Iterable { - private K key; - private V val; + public static class Entry extends Map.Entry { private Entry prev; private Entry next; public Entry(K key, V val) { - this.key = key; - this.val = val; - } - - public K key() - { - return key; - } - public V val() - { - return val; - } - public String toString() { - return "<" + key + "," + val + ">"; + super(key, val); } } @@ -275,7 +267,7 @@ public class OpenAddressingHashTable implements Iterable> { + private class LinkedHashTableIterator implements Iterator> { private Entry start = head; public boolean hasNext() { diff --git a/src/main/java/net/abhinavsarkar/algorist/SortedMap.java b/src/main/java/net/abhinavsarkar/algorist/SortedMap.java new file mode 100644 index 0000000..4ca8f88 --- /dev/null +++ b/src/main/java/net/abhinavsarkar/algorist/SortedMap.java @@ -0,0 +1,16 @@ +package net.abhinavsarkar.algorist; + +import java.util.Optional; + +public interface SortedMap, V> extends Map +{ + + Optional minimum(); + + Optional maximum(); + + Optional successor(K key); + + Optional predecessor(K key); + +} diff --git a/src/main/java/net/abhinavsarkar/algorist/TreeGraphvizVisitor.java b/src/main/java/net/abhinavsarkar/algorist/TreeGraphvizVisitor.java index 698f831..05a2866 100644 --- a/src/main/java/net/abhinavsarkar/algorist/TreeGraphvizVisitor.java +++ b/src/main/java/net/abhinavsarkar/algorist/TreeGraphvizVisitor.java @@ -24,7 +24,7 @@ public class TreeGraphvizVisitor implements AVLTree.Visitor, BinarySearchTree.Vi { MutableNode gNode = mutNode(nodeName); graph.add(gNode); - index.insert(nodeName, gNode); + index.put(nodeName, gNode); } @Override