Implement AB6, Aufgabe 1+2
This commit is contained in:
		| @@ -1,13 +1,13 @@ | ||||
| import org.junit.jupiter.api.Test; | ||||
|  | ||||
| import java.util.HashSet; | ||||
|  | ||||
| import static org.junit.jupiter.api.Assertions.*; | ||||
|  | ||||
| public class Aufgabe6Test { | ||||
|  | ||||
|     @Test | ||||
|     public void testEP2() { | ||||
|  | ||||
|         /* //TODO: uncomment for testing | ||||
|         NamedBody sun1, mercury1, venus1, earth1, moon1, mars1, deimos1, phobos1, vesta1, pallas1, hygiea1, ceres1; | ||||
|  | ||||
|         // create the same 12 named body-force pairs | ||||
| @@ -70,7 +70,7 @@ public class Aufgabe6Test { | ||||
|             set2.add(m); | ||||
|         } | ||||
|  | ||||
|         assertTrue(set1.equals(set2)); | ||||
|         assertEquals(set1, set2); | ||||
|  | ||||
|         MassiveLinkedList list = map.getKeys().toList(); | ||||
|         while (list.size() > 0) { | ||||
| @@ -112,7 +112,5 @@ public class Aufgabe6Test { | ||||
|             count++; | ||||
|         } | ||||
|         assertEquals(12, count); | ||||
|  | ||||
|         */ //TODO: uncomment | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -103,10 +103,10 @@ public class BodyForceTreeMap { | ||||
|      */ | ||||
|     @Override | ||||
|     public String toString() { | ||||
|         return toString(root); | ||||
|         return (root != null) ? toString(root) : ""; | ||||
|     } | ||||
|  | ||||
|     private class Item { | ||||
|     private static class Item { | ||||
|         private final Body key; | ||||
|         private Vector3 value; | ||||
|         private Item parent; | ||||
|   | ||||
| @@ -222,7 +222,7 @@ public class BodyLinkedList implements Iterable<Body> { | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     private class Item { | ||||
|     private static class Item { | ||||
|         private final Body body; | ||||
|         private Item prev; | ||||
|         private Item next; | ||||
|   | ||||
| @@ -5,7 +5,7 @@ import codedraw.CodeDraw; | ||||
|  * and an arbitrary number of subsystems (of type 'CosmicSystem') in its orbit. | ||||
|  * This class implements 'CosmicSystem'. | ||||
|  */ | ||||
| public class HierarchicalSystem implements CosmicSystem { | ||||
| public class HierarchicalSystem implements CosmicSystem, MassiveIterable { | ||||
|  | ||||
|     private final NamedBodyForcePair central; | ||||
|     private CosmicSystem[] orbit; | ||||
| @@ -127,4 +127,53 @@ public class HierarchicalSystem implements CosmicSystem { | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public MassiveIterator iterator() { | ||||
|         return new MassiveIterator() { | ||||
|             private int i = 0; | ||||
|             private MassiveIterator cur = null; | ||||
|  | ||||
|             @Override | ||||
|             public Massive next() { | ||||
|                 if (cur != null && cur.hasNext()) return cur.next(); | ||||
|  | ||||
|                 for (; i < all.length; i++) { | ||||
|                     CosmicSystem sys = all[i]; | ||||
|                     if (sys instanceof NamedBodyForcePair m) { | ||||
|                         i++; | ||||
|                         return m.getBody(); | ||||
|                     } else if (sys instanceof HierarchicalSystem hs) { | ||||
|                         cur = hs.iterator(); | ||||
|                         if (cur.hasNext()) { | ||||
|                             i++; | ||||
|                             return cur.next(); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 return null; | ||||
|             } | ||||
|  | ||||
|             @Override | ||||
|             public boolean hasNext() { | ||||
|                 if (cur != null && cur.hasNext()) return true; | ||||
|  | ||||
|                 for (; i < all.length; i++) { | ||||
|                     CosmicSystem sys = all[i]; | ||||
|                     if (sys instanceof NamedBodyForcePair) { | ||||
|                         return true; | ||||
|                     } else if (sys instanceof HierarchicalSystem hs) { | ||||
|                         cur = hs.iterator(); | ||||
|                         if (cur.hasNext()) { | ||||
|                             i++; | ||||
|                             return true; | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 return false; | ||||
|             } | ||||
|         }; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,12 +1,12 @@ | ||||
| import codedraw.CodeDraw; | ||||
|  | ||||
| /** | ||||
|  * A map that associates an object of 'Massive' with a Vector3. The number of key-value pairs | ||||
|  * is not limited. | ||||
|  */ | ||||
| // TODO: define further classes and methods for the binary search tree and the implementation | ||||
| //  of MassiveSet, if needed. | ||||
| public class MassiveForceTreeMap { | ||||
|  | ||||
|     // TODO: define missing parts of this class. | ||||
| public class MassiveForceTreeMap implements MassiveSet { | ||||
|     private int size = 0; | ||||
|     private Item root; | ||||
|  | ||||
|     /** | ||||
|      * Adds a new key-value association to this map. If the key already exists in this map, | ||||
| @@ -14,7 +14,37 @@ public class MassiveForceTreeMap { | ||||
|      * Precondition: key != null. | ||||
|      */ | ||||
|     public Vector3 put(Massive key, Vector3 value) { | ||||
|         // TODO: implement method. | ||||
|         if (root == null) { | ||||
|             root = new Item(key, value); | ||||
|             size++; | ||||
|             return null; | ||||
|         } | ||||
|  | ||||
|         Item item = root; | ||||
|         while (item != null) { | ||||
|             if (item.key.equals(key)) { | ||||
|                 Vector3 old = item.value; | ||||
|                 item.value = value; | ||||
|                 return old; | ||||
|             } else if (item.key.mass() > key.mass()) { | ||||
|                 if (item.left != null) { | ||||
|                     item = item.left; | ||||
|                 } else { | ||||
|                     item.setLeft(new Item(key, value)); | ||||
|                     size++; | ||||
|                     break; | ||||
|                 } | ||||
|             } else { | ||||
|                 if (item.right != null) { | ||||
|                     item = item.right; | ||||
|                 } else{ | ||||
|                     item.setRight(new Item(key, value)); | ||||
|                     size++; | ||||
|                     break; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
| @@ -24,7 +54,16 @@ public class MassiveForceTreeMap { | ||||
|      * Precondition: key != null. | ||||
|      */ | ||||
|     public Vector3 get(Massive key) { | ||||
|         // TODO: implement method. | ||||
|         Item item = root; | ||||
|         while (item != null) { | ||||
|             if (item.key.equals(key)) { | ||||
|                 return item.value; | ||||
|             } else if (item.key.mass() > key.mass()) { | ||||
|                 item = item.left; | ||||
|             } else { | ||||
|                 item = item.right; | ||||
|             } | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
| @@ -33,17 +72,36 @@ public class MassiveForceTreeMap { | ||||
|      * Precondition: key != null | ||||
|      */ | ||||
|     public boolean containsKey(Massive key) { | ||||
|         // TODO: implement method. | ||||
|         Item item = root; | ||||
|         while (item != null) { | ||||
|             if (item.key.equals(key)) { | ||||
|                 return true; | ||||
|             } else if (item.key.mass() > key.mass()) { | ||||
|                 item = item.left; | ||||
|             } else { | ||||
|                 item = item.right; | ||||
|             } | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     private String toString(Item item) { | ||||
|         String s = ""; | ||||
|         if (item == null) { | ||||
|             return s; | ||||
|         } | ||||
|         s += this.toString(item.right); | ||||
|         s += String.format("{%s: %s}\n", item.key, item.value); | ||||
|         s += this.toString(item.left); | ||||
|         return s; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns a readable representation of this map, in which key-value pairs are ordered | ||||
|      * descending according to 'key.getMass()'. | ||||
|      */ | ||||
|     public String toString() { | ||||
|         // TODO: implement method. | ||||
|         return ""; | ||||
|         return (root != null) ? toString(root) : ""; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -51,10 +109,126 @@ public class MassiveForceTreeMap { | ||||
|      * elements of the returned `MassiveSet` object also affects the keys in this tree map. | ||||
|      */ | ||||
|     public MassiveSet getKeys() { | ||||
|         // TODO: implement method. | ||||
|         return null; | ||||
|         return this; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void draw(CodeDraw cd) { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public MassiveIterator iterator() { | ||||
|         return new MassiveIterator() { | ||||
|             private Item next = root.getLeftLeaf(); | ||||
|  | ||||
|             @Override | ||||
|             public Massive next() { | ||||
|                 if (next == null) return null; | ||||
|                 Massive m = next.key; | ||||
|                 Item newNext = (next.right != null) ? next.right.getLeftLeaf() : next.parent; | ||||
|                 while (newNext != null && newNext.right == next) { | ||||
|                     next = newNext; | ||||
|                     newNext = newNext.parent; | ||||
|                 } | ||||
|                 next = newNext; | ||||
|                 return m; | ||||
|             } | ||||
|  | ||||
|             @Override | ||||
|             public boolean hasNext() { | ||||
|                 return next != null; | ||||
|             } | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean contains(Massive element) { | ||||
|         return containsKey(element); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void remove(Massive element) { | ||||
|         Item item = root; | ||||
|         while (item != null) { | ||||
|             if (item.key.equals(element)) { | ||||
|                 Item newP = null; | ||||
|                 if (item.left != null) { | ||||
|                     newP = item.left.getRightLeaf(); | ||||
|                 } else if (item.right != null) { | ||||
|                     newP = item.right.getLeftLeaf(); | ||||
|                 } | ||||
|                 if (item.parent.left == item) { | ||||
|                     item.parent.setLeft(newP); | ||||
|                 } else { | ||||
|                     item.parent.setRight(newP); | ||||
|                 } | ||||
|                 size--; | ||||
|                 return; | ||||
|             } else if (item.key.mass() > element.mass()) { | ||||
|                 item = item.left; | ||||
|             } else { | ||||
|                 item = item.right; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void clear() { | ||||
|         size = 0; | ||||
|         root = null; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public int size() { | ||||
|         return size; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public MassiveLinkedList toList() { | ||||
|         MassiveLinkedList list = new MassiveLinkedList(); | ||||
|         for (Massive m : this) { | ||||
|             list.addLast(m); | ||||
|         } | ||||
|         return list; | ||||
|     } | ||||
|  | ||||
|     private static class Item { | ||||
|         private final Massive key; | ||||
|         private Vector3 value; | ||||
|         private Item parent; | ||||
|         private Item left; | ||||
|         private Item right; | ||||
|  | ||||
|         public Item(Massive key, Vector3 value) { | ||||
|             this.key = key; | ||||
|             this.value = value; | ||||
|         } | ||||
|  | ||||
|         public void setLeft(Item left) { | ||||
|             this.left = left; | ||||
|             if (left != null) left.parent = this; | ||||
|         } | ||||
|  | ||||
|         public void setRight(Item right) { | ||||
|             this.right = right; | ||||
|             if (right != null) right.parent = this; | ||||
|         } | ||||
|  | ||||
|         public Item getLeftLeaf() { | ||||
|             Item cur = this; | ||||
|             while (cur.left != null) { | ||||
|                 cur = cur.left; | ||||
|             } | ||||
|             return cur; | ||||
|         } | ||||
|  | ||||
|         public Item getRightLeaf() { | ||||
|             Item cur = this; | ||||
|             while (cur.right != null) { | ||||
|                 cur = cur.right; | ||||
|             } | ||||
|             return cur; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| //TODO: Define additional class(es) implementing the binary search tree and the implementation | ||||
| // of MassiveSet (either here or in a separate file). | ||||
|   | ||||
| @@ -98,7 +98,7 @@ public class MassiveLinkedList implements Iterable<Massive> { | ||||
|             return null; | ||||
|         } | ||||
|         Massive m = last.body; | ||||
|         last = last.next; | ||||
|         last = last.prev; | ||||
|         if (last != null) last.setNext(null); | ||||
|         size--; | ||||
|         return m; | ||||
| @@ -194,7 +194,7 @@ public class MassiveLinkedList implements Iterable<Massive> { | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     private class Item { | ||||
|     private static class Item { | ||||
|         private final Massive body; | ||||
|         private Item prev; | ||||
|         private Item next; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user