From 3c64f584397d22bfe0c271cf0ca0015bd0a428b5 Mon Sep 17 00:00:00 2001 From: akimmig Date: Mon, 23 Jan 2023 12:23:11 +0100 Subject: [PATCH] Set --- Queue.java | 18 +++--- Set.java | 168 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 176 insertions(+), 10 deletions(-) create mode 100644 Set.java diff --git a/Queue.java b/Queue.java index ea53f7c..a4af08a 100644 --- a/Queue.java +++ b/Queue.java @@ -5,6 +5,11 @@ public class Queue */ public Node first; + /** + * letzter Eintrag der Liste + */ + public Node last; + /** * Konstruktor */ @@ -29,17 +34,10 @@ public class Queue if (first == null) { // setze neue Node als ersten Eintrag first = n; + last = n; } else { - Node current = first; - - // gehe zum letzten Eintrag - while (current.next != null) { - current = current.next; - } - - // current ist jetzt der letzte Eintrag - // setze neue Node als Nachfolger von bisher letzem Eintrag - current.setNext(n); + last.next = n; + last = n; } } diff --git a/Set.java b/Set.java new file mode 100644 index 0000000..db397b4 --- /dev/null +++ b/Set.java @@ -0,0 +1,168 @@ +public class Set +{ + /** + * erster Eintrag der Liste + */ + public Node first; + + /** + * Konstruktor + */ + public Set() {} + + /** + * Überprüft, ob die Liste leer ist + * + * @return true, wenn keine Elemente in der Liste + */ + public boolean isEmpty() { + return first == null; + } + + /** + * Berechnet die Größe der Liste + * + * @return Anzahl der Elemente in der Liste + */ + public int size() { + Node current = first; + int laenge = 0; + + while (current != null) { + current = current.next; + laenge++; + } + + return laenge; + } + + /** + * Überprüft, ob die Liste einen konkreten Wert enthält + */ + public boolean contains(T wert) { + Node current = first; + + while (current != null) { + if (current.wert == wert) return true; + + current = current.next; + } + + return false; + } + + /** + * Fügt ein neues Element am Anfang der Liste ein + */ + public void add(T neu) { + if (contains(neu)) return; + + Node n = new Node(neu); // Neue Node mit Zahl "neu" anlegen + + n.next = first; + first = n; + } + + /** + * Löscht das Element mit dem angegebenen Wert + */ + public void remove(T wert) { + if (!contains(wert)) return; + + if (first.wert == wert) { + first = first.next; + } else { + Node current = first; + + if (current.next.wert == wert) { + current.next = current.next.next; + return; + } + } + } + + /** + * Bildet die Schnittmenge + */ + public Set intersection(Set s) { + Set neu = new Set(); + + Node current = first; + + // gehe alle Elemente in this durch + while (current != null) { + // wenn auch s das Element enthält... + if (s.contains(current.wert)) { + // ... füge es der Schnittmenge hinzu + neu.add(current.wert); + } + current = current.next; + } + + return neu; + } + + /** + * Bildet die Vereinigungsmenge + */ + public Set union(Set s) { + Set neu = new Set(); + + // gehe aktuelles Set durch und füge alle Werte zum + // neuen hinzu + Node current = first; + while (current != null) { + neu.add(current.wert); + current = current.next; + } + + // gehe s durch und füge alle Werte hinzu + // doppelte Einträge werden bei add automatisch + // gefiltert und nicht doppelt eingetragen + Node current2 = s.first; + while (current2 != null) { + neu.add(current2.wert); + current = current2.next; + } + + return neu; + } + + /** + * Bildet die Differenz + */ + public Set difference(Set s) { + Set neu = new Set(); + + // gehe aktuelles Set durch + Node current = first; + while (current != null) { + // falls der Wert nicht in s enthalten ist... + if (!s.contains(current.wert)) { + // ... füge den zur Differenz hinzu + neu.add(current.wert); + } + } + + return neu; + } + + /** + * Überprüft, ob s eine Teilmenge ist + */ + public boolean subset(Set s) { + Node current = s.first; + // gehe alle Elemente in s durch + while(current != null) { + // falls ein Wert nicht in this ist... + if (!contains(current.wert)) { + // ... ist s keine Teilmenge und kann abgebrochen werden + return false; + } + } + // läuft die Schleife bis zum Ende, dann sind alle + // Elemente aus s auch in this enthalten, dann ist + // s also eine Teilmenge von this + return true; + } +}