diff --git a/SimpleArrayMap/.classpath b/SimpleArrayMap/.classpath new file mode 100644 index 0000000..be55723 --- /dev/null +++ b/SimpleArrayMap/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/SimpleArrayMap/.project b/SimpleArrayMap/.project new file mode 100644 index 0000000..9d3da61 --- /dev/null +++ b/SimpleArrayMap/.project @@ -0,0 +1,17 @@ + + + SimpleArrayMap + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/SimpleArrayMap/src/solution/SimpleArrayMap.java b/SimpleArrayMap/src/solution/SimpleArrayMap.java new file mode 100644 index 0000000..902d7fe --- /dev/null +++ b/SimpleArrayMap/src/solution/SimpleArrayMap.java @@ -0,0 +1,107 @@ +package solution; + +import java.util.function.Consumer; + +import testat.ISimpleMap; + +public class SimpleArrayMap implements ISimpleMap { + + private int size; + private K[] keys; + private V[] values; + + public SimpleArrayMap(int maxSize) { + size = 0; + keys = (K[]) new Object[maxSize]; + values = (V[]) new Object[maxSize]; + } + + @Override + public V put(K k, V v) { + + if (k == null || v == null) { + return null; + } + for (int i = 0; i < values.length; i++) { + if (k.equals(keys[i])) { // found + V result = values[i]; + values[i] = v; + return result; + } + } + for (int i = 0; i < values.length; i++) { + if (keys[i] == null) { // empty + keys[i] = k; + values[i] = v; + size++; + return null; + } + } + return null; + } + + @Override + public V get(K k) { + if (k == null) { + return null; + } + for (int i = 0; i < values.length; i++) { + if (k.equals(keys[i])) { // found + return values[i]; + } + } + return null; + } + + @Override + public V remove(K k) { + if (k == null) { + return null; + } + for (int i = 0; i < values.length; i++) { + if (k.equals(keys[i])) { // found + V v = values[i]; + size--; + keys[i] = null; + values[i] = null; + return v; + } + } + return null; + } + + @Override + public boolean contains(V v) { + if (v == null) { + return false; + } + int counter = 0; + for (int i = 0; i < values.length; i++) { + if (v.equals(values[i])) { + return true; + } + if (values[i] != null) { + counter++; + } + if (counter == size) { + return false; + } + } + return false; + } + + @Override + public void forEach(Consumer consumer) { + for (int i = 0; i < values.length; i++) { + if (keys[i] != null) { // found + consumer.accept(values[i]); + } + } + } + + @Override + public int size() { + return size; + } + +} diff --git a/SimpleArrayMap/src/solution/SimpleArrayMapTest.java b/SimpleArrayMap/src/solution/SimpleArrayMapTest.java new file mode 100644 index 0000000..8cea516 --- /dev/null +++ b/SimpleArrayMap/src/solution/SimpleArrayMapTest.java @@ -0,0 +1,13 @@ +package solution; + +import testat.ASimpleMapTest; +import testat.ISimpleMap; + +public class SimpleArrayMapTest extends ASimpleMapTest { + + @Override + protected ISimpleMap getInstance() { + return new SimpleArrayMap<>(5); + } + +} diff --git a/SimpleArrayMap/src/testat/ASimpleMapTest.java b/SimpleArrayMap/src/testat/ASimpleMapTest.java new file mode 100644 index 0000000..f22d71d --- /dev/null +++ b/SimpleArrayMap/src/testat/ASimpleMapTest.java @@ -0,0 +1,242 @@ +package testat; + +import static org.junit.Assert.assertEquals; + +import java.util.function.Consumer; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public abstract class ASimpleMapTest { + + ISimpleMap map; + + protected abstract ISimpleMap getInstance(); + + private int counter = 0; + private String result; + + Consumer action = s -> { + counter++; + result = result + s; + }; + + @BeforeAll + static void setUpBeforeClass() throws Exception { + } + + @BeforeEach + void setUp() throws Exception { + map = getInstance(); + } + + @Test + void testadd1() { + String actual = map.put("1", "Hallo"); + assertEquals(null, actual); + } + + @Test + void testadd2a() { + String actual = map.put(null, "xxx"); + assertEquals(null, actual); + } + + @Test + void testadd2b() { + String actual = map.put("1", null); + assertEquals(null, actual); + } + + @Test + void testadd3() { + add3(); + String actual = map.put("1", "Hallo"); + assertEquals("Eins", actual); + } + + @Test + void testadd4() { + add3(); + map.put("4", "Vier"); + map.put("5", "Fünf"); + map.remove("3"); + map.put("6", "Sechs"); + + String actual = map.get("1"); + assertEquals("Eins", actual); + actual = map.get("2"); + assertEquals("Zwei", actual); + actual = map.get("4"); + assertEquals("Vier", actual); + actual = map.get("5"); + assertEquals("Fünf", actual); + actual = map.get("6"); + assertEquals("Sechs", actual); + } + + @Test + void testget1() { + String actual = map.get(null); + assertEquals(null, actual); + } + + @Test + void testget2() { + String actual = map.get("1"); + assertEquals(null, actual); + } + + @Test + void testget3() { + add3(); + String actual = map.get("1"); + assertEquals("Eins", actual); + actual = map.get("2"); + assertEquals("Zwei", actual); + actual = map.get("3"); + assertEquals("Drei", actual); + } + + @Test + void testremove1() { + String actual = map.remove(null); + assertEquals(null, actual); + } + + @Test + void testremove2() { + String actual = map.remove("1"); + assertEquals(null, actual); + } + + @Test + void testremove3() { + add3(); + String actual = map.remove(null); + assertEquals(null, actual); + } + + @Test + void testremove4() { + add3(); + String actual = map.remove("9"); + assertEquals(null, actual); + } + + @Test + void testremove5() { + add3(); + String actual = map.remove("1"); + assertEquals("Eins", actual); + actual = map.get("1"); + assertEquals(null, actual); + actual = map.remove("2"); + assertEquals("Zwei", actual); + actual = map.get("2"); + assertEquals(null, actual); + actual = map.remove("3"); + assertEquals("Drei", actual); + actual = map.get("3"); + assertEquals(null, actual); + } + + @Test + void testcontains1() { + Boolean actual = map.contains(null); + assertEquals(false, actual); + } + + @Test + void testcontains2() { + Boolean actual = map.contains("1"); + assertEquals(false, actual); + } + + @Test + void testcontains3() { + add3(); + Boolean actual = map.contains("Eins"); + assertEquals(true, actual); + actual = map.contains("Zwei"); + assertEquals(true, actual); + actual = map.contains("Drei"); + assertEquals(true, actual); + actual = map.contains("xxx"); + assertEquals(false, actual); + } + + @Test + void testsize1() { + int actual = map.size(); + assertEquals(0, actual); + } + + @Test + void testsize2() { + add3(); + int actual = map.size(); + assertEquals(3, actual); + } + + @Test + void testAddSize1() { + add3(); + add3(); + int actual = map.size(); + assertEquals(3, actual); + } + + @Test + void testRemoveSize1() { + add3(); + map.remove("2"); + int actual = map.size(); + assertEquals(2, actual); + } + + @Test + void testRemoveContains1() { + add3(); + map.remove("2"); + Boolean actual = map.contains("Eins"); + assertEquals(true, actual); + actual = map.contains("Zwei"); + assertEquals(false, actual); + actual = map.contains("Drei"); + assertEquals(true, actual); + actual = map.contains("xxx"); + assertEquals(false, actual); + } + + @Test + void testForAll1() { + map.forEach(null); + assertEquals(true, true); + } + + @Test + void testForAll2() { + map.forEach(action); + assertEquals(true, true); + } + + @Test + void testForAll3() { + add3(); + counter = 0; + result = new String(""); + map.forEach(action); + assertEquals(3, counter); + assertEquals(true, result.contains("Eins")); + assertEquals(true, result.contains("Zwei")); + assertEquals(true, result.contains("Drei")); + } + + protected void add3() { + map.put("1", "Eins"); + map.put("2", "Zwei"); + map.put("3", "Drei"); + } +} diff --git a/SimpleArrayMap/src/testat/ISimpleMap.java b/SimpleArrayMap/src/testat/ISimpleMap.java new file mode 100644 index 0000000..cb039dc --- /dev/null +++ b/SimpleArrayMap/src/testat/ISimpleMap.java @@ -0,0 +1,33 @@ +package testat; + +import java.util.function.Consumer; + +public interface ISimpleMap { + + // speichert zu den Schlüssel k den Wert v, sofern beide nicht null sind (in + // diesem Fall wird null zurück gegeben) . + // Falls zu k bereits ein Wert w vorhanden ist, wird dieser durch v ersetzt. Der + // alte + // Wert w wird zurückgegebn. Falls zu k noch kein Wert gespeichert war, wird + // null zurückgegeben + V put(K k, V v); + + // Liefert den zum Schlüssel k gespeicherten Wert. Liefert null, falls k == + // null oder falls zu k kein Wert gespeichert war + V get(K k); + + // Entfernt den zum Schlüssel k gespeicherten Wert v und liefert v zurück. + // Liefert null, falls k == + // null oder falls zu k kein Wert gespeichert war + V remove(K k); + + // Liefert true, falls der Wert v in der Map gespeichert ist + boolean contains(V v); + + // wendet die Methode consumer.accept(v) auf alle in der Map gespeicherten Werte + // an + void forEach(Consumer consumer); + + int size(); // Anzahl an in der Map gespeicherten Werte + +}