Implement AB6, Aufgabe 1+2
This commit is contained in:
@ -1,13 +1,13 @@
|
|||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.*;
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
public class Aufgabe6Test {
|
public class Aufgabe6Test {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testEP2() {
|
public void testEP2() {
|
||||||
|
|
||||||
/* //TODO: uncomment for testing
|
|
||||||
NamedBody sun1, mercury1, venus1, earth1, moon1, mars1, deimos1, phobos1, vesta1, pallas1, hygiea1, ceres1;
|
NamedBody sun1, mercury1, venus1, earth1, moon1, mars1, deimos1, phobos1, vesta1, pallas1, hygiea1, ceres1;
|
||||||
|
|
||||||
// create the same 12 named body-force pairs
|
// create the same 12 named body-force pairs
|
||||||
@ -70,7 +70,7 @@ public class Aufgabe6Test {
|
|||||||
set2.add(m);
|
set2.add(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
assertTrue(set1.equals(set2));
|
assertEquals(set1, set2);
|
||||||
|
|
||||||
MassiveLinkedList list = map.getKeys().toList();
|
MassiveLinkedList list = map.getKeys().toList();
|
||||||
while (list.size() > 0) {
|
while (list.size() > 0) {
|
||||||
@ -112,7 +112,5 @@ public class Aufgabe6Test {
|
|||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
assertEquals(12, count);
|
assertEquals(12, count);
|
||||||
|
|
||||||
*/ //TODO: uncomment
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -103,10 +103,10 @@ public class BodyForceTreeMap {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return toString(root);
|
return (root != null) ? toString(root) : "";
|
||||||
}
|
}
|
||||||
|
|
||||||
private class Item {
|
private static class Item {
|
||||||
private final Body key;
|
private final Body key;
|
||||||
private Vector3 value;
|
private Vector3 value;
|
||||||
private Item parent;
|
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 final Body body;
|
||||||
private Item prev;
|
private Item prev;
|
||||||
private Item next;
|
private Item next;
|
||||||
|
@ -5,7 +5,7 @@ import codedraw.CodeDraw;
|
|||||||
* and an arbitrary number of subsystems (of type 'CosmicSystem') in its orbit.
|
* and an arbitrary number of subsystems (of type 'CosmicSystem') in its orbit.
|
||||||
* This class implements 'CosmicSystem'.
|
* This class implements 'CosmicSystem'.
|
||||||
*/
|
*/
|
||||||
public class HierarchicalSystem implements CosmicSystem {
|
public class HierarchicalSystem implements CosmicSystem, MassiveIterable {
|
||||||
|
|
||||||
private final NamedBodyForcePair central;
|
private final NamedBodyForcePair central;
|
||||||
private CosmicSystem[] orbit;
|
private CosmicSystem[] orbit;
|
||||||
@ -127,4 +127,53 @@ public class HierarchicalSystem implements CosmicSystem {
|
|||||||
|
|
||||||
return true;
|
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
|
* A map that associates an object of 'Massive' with a Vector3. The number of key-value pairs
|
||||||
* is not limited.
|
* is not limited.
|
||||||
*/
|
*/
|
||||||
// TODO: define further classes and methods for the binary search tree and the implementation
|
public class MassiveForceTreeMap implements MassiveSet {
|
||||||
// of MassiveSet, if needed.
|
private int size = 0;
|
||||||
public class MassiveForceTreeMap {
|
private Item root;
|
||||||
|
|
||||||
// TODO: define missing parts of this class.
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a new key-value association to this map. If the key already exists in this map,
|
* 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.
|
* Precondition: key != null.
|
||||||
*/
|
*/
|
||||||
public Vector3 put(Massive key, Vector3 value) {
|
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;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -24,7 +54,16 @@ public class MassiveForceTreeMap {
|
|||||||
* Precondition: key != null.
|
* Precondition: key != null.
|
||||||
*/
|
*/
|
||||||
public Vector3 get(Massive key) {
|
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;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -33,17 +72,36 @@ public class MassiveForceTreeMap {
|
|||||||
* Precondition: key != null
|
* Precondition: key != null
|
||||||
*/
|
*/
|
||||||
public boolean containsKey(Massive key) {
|
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;
|
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
|
* Returns a readable representation of this map, in which key-value pairs are ordered
|
||||||
* descending according to 'key.getMass()'.
|
* descending according to 'key.getMass()'.
|
||||||
*/
|
*/
|
||||||
public String toString() {
|
public String toString() {
|
||||||
// TODO: implement method.
|
return (root != null) ? toString(root) : "";
|
||||||
return "";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -51,10 +109,126 @@ public class MassiveForceTreeMap {
|
|||||||
* elements of the returned `MassiveSet` object also affects the keys in this tree map.
|
* elements of the returned `MassiveSet` object also affects the keys in this tree map.
|
||||||
*/
|
*/
|
||||||
public MassiveSet getKeys() {
|
public MassiveSet getKeys() {
|
||||||
// TODO: implement method.
|
return this;
|
||||||
return null;
|
}
|
||||||
|
|
||||||
|
@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;
|
return null;
|
||||||
}
|
}
|
||||||
Massive m = last.body;
|
Massive m = last.body;
|
||||||
last = last.next;
|
last = last.prev;
|
||||||
if (last != null) last.setNext(null);
|
if (last != null) last.setNext(null);
|
||||||
size--;
|
size--;
|
||||||
return m;
|
return m;
|
||||||
@ -194,7 +194,7 @@ public class MassiveLinkedList implements Iterable<Massive> {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private class Item {
|
private static class Item {
|
||||||
private final Massive body;
|
private final Massive body;
|
||||||
private Item prev;
|
private Item prev;
|
||||||
private Item next;
|
private Item next;
|
||||||
|
Reference in New Issue
Block a user