3.1 UML: Assoziationen und Multiplizitäten • Definition: Eine (binäre) Assoziation AS zwischen zwei Klassen K1 und K2 beschreibt, daß die Instanzen der beiden Klassen in einer fachlich wesentlichen Beziehung zueinander stehen. Kapitel 3: Datenstrukturen verwenden • Semantik: Für jedes Objekt O1 der Klasse K1 gibt es eine individuelle, veränderbare und endliche Menge AS von Objekten der Klasse K2, mit dem die Assoziation AS besteht. Analoges gilt für Objekte von K2 . 3.1 UML: Assoziationen und Multiplizitäten 3.2 Systematische Umsetzung nach Java 3.3 Kollektionen und Iteratoren • Notation: AS K1 K2 • Beispiel: Leitung Teambesprechung Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K3 - 1 Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Leserichtung und Assoziationsenden findet statt in VeranstOrt für Team Reservierung • Ein Name für ein Assoziationsende bezeichnet die Assoziation (evtl. zusätzlich) aus der Sicht einer der teilnehmenden Klassen. Veranstaltungsort Teambesprechung K3 - 2 Besprechungsraum Besprechungsraum ist Ort von Objektoiertierte Programmierung Am Beispiel: Assoziationen • Für Assoziationsnamen kann die Leserichtung angegeben werden. Es ist möglich, mehrere Namen für eine Assoziation anzugeben. Teambesprechung Teammitglied Besprechungsraum Teambesprechung Leiter Mitglied leitet Privater Termin Teammitglied Teilnahme für – Synonym zu Assoziationsende manchmal: Rollenname Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K3 - 3 Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Multiplizität bei Assoziationen * Besprechungsraum 1 für * Reservierung 1 Privater Termin (auch 0) (beliebiger Wert, einschließlich 0) Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) * Teambesprechung 0..1 1 1..* Mitglied leitet Teilnahme * * • Beispiel: * Team 1 0..1 VeranstOrt (genau n Objekte der Klasse K2) (n bis m Objekte der Klasse K2) (n1 oder n2 Objekte der Klasse K2) Teambesprechung K3 - 4 Am Beispiel: Multiplizitäten • Definition Die Multiplizität einer Klasse K1 in einer Assoziation AS mit einer Klasse K2 begrenzt die Menge der Objekte der Klasse K2, mit denen ein Objekt von K1 in der Assoziation AS stehen darf. AS • Notation: K1 K2 Mult Multiplizität Mult: n n..m n1, n2 Zulässig für n und m : Zahlenwerte Objektoiertierte Programmierung 2..* 1 Leiter Teammitglied 1 für 2..* Teammitglied Teilnahme Objektoiertierte Programmierung K3 - 5 Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Seite 1 Objektoiertierte Programmierung K3 - 6 Aggregation Am Beispiel: Assoziationen und Agregationen Besprechungsraum • Definition: Ein Spezialfall der Assoziation ist die Aggregation. Wenn die Assoziation den Namen „besteht aus“ tragen könnte, handelt es sich um eine Aggregation. Eine Aggregation besteht zwischen einem Aggregat und seinen Teilen. 1 für Team * Reservierung 1 0..1 VeranstOrt 0..1 • Notation: K1 K2 1 Privater Termin • Beispiel: Team Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K3 - 7 Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) * raumFestlegen einladen absagen Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) * Termin name 1 1..* * Objektoiertierte Programmierung titel beginn dauer verschieben 0..1 Team name 1 0..1 VeranstOrt 1 Leiter * Privater Termin ort wegzeit leitet Teammitglied 1 name abteilung Teilnahme terminBestätigen * 2..* 1 für Objektoiertierte Programmierung Besprechungsraum raumNr kapazität reservieren freigeben freienRaumSuchen Teambesprechung anzahl raumFestlegen einladen absagen verschieben verschieben * K3 - 9 für 1..* * Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung Qualifizierte Assoziation • Definition: Eine Qualifikation (Qualifier) ist ein Attribut für eine • Beispiel (Programmcode im nächsten Abschnitt): • Notation: * leitet 1 Teilnahme * 2..* 1 Leiter Teammitglied 1 name abteilung Teilnahme terminBestätigen * 2..* 1 • Assoziationen werden verwendet, um im Objektgeflecht zu navigieren. • Assoziationen sind im Normalfall in beiden Richtungen navigierbar (d.h. werden auf beiden Seiten wie ein Attribut behandelt). • Spezialfall: einseitige Navigationsrichtung (d.h. nur auf einer Seite wie Attribut behandelt). themen [0..*] raumFestlegen einladen absagen verschieben 0..1 leitet Navigationsrichtung von Assoziationen Teambesprechung K3 - 8 ... und abstrakten Elementen und Vererbung Team Teambesprechung titel beginn dauer anzahl 1 1 0..1 Ort Privater Termin beschreibg beginn dauer ort wegzeit genehmigen verschieben 2..* Terminverwaltung Besprechungsraum raumNr kapazität reservieren freigeben freienRaumSuchen * 1 Leiter 1..* Teammitglied für Das Beispiel mit Operationen und Attributen ... Hier Klasse Reservierung aus Platzgründen weggelassen 1 Teilnahme * * Teammitglied leitet * Teambesprechung K3 - 10 Assoziation zwischen Klassen K1 und K2, durch das die Menge der zu einem K1-Objekt assoziierten K2-Objekte partitioniert wird. Zweck der Qualifikation ist direkter Zugriff unter Vermeidung von Suche. K1 Teammitglied Name Abteilung terminBestätigen a 0..1 K2 statt: K1 0..* K2 Navigationsrichtung Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K3 - 11 Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Seite 2 Objektoiertierte Programmierung K3 - 12 Ein Beispiel ohne qualifizierte Assoziation: Das Beispiel mit qualifizierten Assoziationen: Termin Raumverwaltung Termin Raumverwaltung titel beginn dauer [0..1] verschieben – einzigeInstanz titel beginn dauer [0..1] verschieben freienRaumSuchen freienRaumSuchen 1 * Teambesprechung themen [0..*] 0..* raumFestlegen einladen absagen verschieben vorhanden – einzigeInstanz größe 1 vorhanden * Teambesprechung Besprechungsraum themen [0..*] 0..1 0..1 raumNr raumFestlegen beginn kapazität Veranstaleinladen reservieren tungsort absagen freigeben verschieben Besprechungsraum raumNr 0..1 kapazität Veranstalreservieren tungsort freigeben freienRaumSuchen Raumverwaltung.freienRaumSuchen (plaetze=10, start=04.05.98 10:00, dauer=60, raum=R12); Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K3 - 13 Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) 3.2 Systematische Umsetzung nach Java K3 - 14 ... und Konstruktoren für Objekte Zur Erinnerung: Realisierung von Klassen ... class Teammitglied { private String name; private String abteilung; Teammitglied – name: String – abteilung: String public Teammitglied (String name, String abteilung) { this.name = name; this.abteilung = abteilung; } + terminBestätigen (von: Date, bis: Date):boolean public Teammitglied (String name) { this.name = name; abteilung = ""; } class Teammitglied { private String name; private String abteilung; } Objektoiertierte Programmierung public boolean terminBestaetigen (Date von, Date bis) { // geeigneter Methodenrumpf } ... } Teammitglied m = new Teammitglied("Max Müller", "Abt. B"); Konstruktoren werden meist überladen. Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K3 - 15 Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K3 - 16 Standard-Realisierung von gerichteten Assoziationen mit beschränkter Multiplizität Feinheit: Der Default-Konstruktor class Teammitglied { ... // ohne Konstruktor } A a 0..1 B class A { ... private B a; ... } B class A { ... private B[] a; ... } Teammitglied m = new Teammitglied(); A • Für jede Klasse gibt es immer mindestens einen Konstruktor. a 0..* • Wenn kein benutzerdefinierter Konstruktor vorliegt, wird ein "Default-Konstruktor" bereitgestellt. • Der Default-Konstruktor ist nicht mehr für die Klasse verfügbar, wenn irgendein benutzerdefinierter Konstruktor definiert wird ! Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung Annahme hier: Obergrenze der Anzahl der B-Objekte spätestens bei erstmaliger Eintragung von Assoziationsinstanzen bekannt und relativ klein. (Allgemeinere Realisierung siehe Ende des Kapitels.) K3 - 17 Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Seite 3 Objektoiertierte Programmierung K3 - 18 Umsetzung einer gerichteten Assoziation Teambesprechung teilnahme 0..* Optionale und notwendige Assoziationen Teammitglied – abstimmen 0..1 b A + terminBestaetigen class A { ... private B b; ... } B class Teambesprechung { private Teammitglied[] teilnahme; ... } 1 b A class A { ... private B b; ... public A (B b, ...) { this.b = b; ... } } B private boolean abstimmen (Date beginn, int dauer) { boolean ok = true; for (int i=0; i<teilnahme.length; i++) ok = ok && teilnahme[i].terminBestaetigen(beginn, dauer); return ok; } Analog für andere Multiplizitäten wie 0..* und 1..* Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K3 - 19 Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Umsetzung verschiedener Assoziationen Teambesprechung + anzahl: int ... * leitet 1 teilnahme * 2..* Realisierung von Aggregation / Komposition – name: String – abteilung: String A ... Objektoiertierte Programmierung A Entwurfs-Modell Notation: UML Notation: UML Objekte: Fachgegenstände Klassen: Fachbegriffe Vererbung: Begriffsstruktur Objekte: Softwareeinheiten Klassen: Schemata Vererbung: Programmableitung Annahme perfekter Technologie Funktionale Essenz Erfüllung konkreter Rahmenbedingungen Gesamtstruktur des Systems Grobe Strukturskizze Genaue Strukturdefinition Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) B 0..* B Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) class A { ... private B[] b; ... } Objektoiertierte Programmierung K3 - 22 3.3 Kollektionen und Iteratoren Java 2 Collection Framework • Objektorientierte Datenstrukturbibliothek für Java – meiste Standard-Datenstrukturen abgedeckt – Verwendung von Vererbung zur Strukturierung – flexibel auch zur eigenen Erweiterung • „Geschichte“: – basiert auf Java Generic Library (JGL) der Firma ObjectSpace – bis JDK 1.1 „alte“ Datenstrukturklassen Vector, Hashtable ... – seit Java 1.2 (Java-2) Standard => java.util.* Mehr Struktur & mehr Details Objektoiertierte Programmierung a 0..* – spezielle Semantik für Komposition geht aber verloren! K3 - 21 Analyse-Modell b • Aggregationen können genau analog zu Assoziationen abgebildet werden ! • Kompositionen werden ebenfalls analog zu Assoziationen abgebildet. Abstraktionsstufen von UML-Diagrammen Übergang „ohne Bruch“ (gemeinsame Terminologie) K3 - 20 Teammitglied class Teambesprechung { static public int anzahl; private Teammitglied leitet; private Teammitglied teilnahme[]; ... public Teambesprechung (Teammitglied leitet, Teammitglied[] teilnehmer) { this.leitet = leitet; this.teilnahme = teilnehmer; anzahl += 1; } } class Teammitglied { Konstruktor ohne private String name; „teilnahme“-Parameter private String abteilung; private Teambesprechung[] teilnahme; ... } Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K3 - 23 Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Seite 4 Objektoiertierte Programmierung K3 - 24 Anwendungsbeispiel für Datenstrukturen Testprogramm für Anwendungsbeispiel Entwurfsmodell „Bestellungsabwicklung“ (Auszug): public static void main (String[] args) { Artikel tisch = new Artikel("Tisch",200); Artikel stuhl = new Artikel("Stuhl",100); Artikel schrank = new Artikel("Schrank",300); Bestellung – kunde: String + neuePosition(b: Bestellposition) + löschePosition(pos int) + sonderpreis(pos: int, preis: int) + auftragssumme(): int + print() „Sonderpreise“ als kleine Komplikation 1 Bestellung b1 = new Bestellung(“UniBw"); b1.neuePosition(new Bestellposition(tisch,1)); b1.neuePosition(new Bestellposition(stuhl,4)); b1.neuePosition(new Bestellposition(schrank,2)); b1.print(); // Gesamtpreis 1200 * Bestellposition – anzahl: int – preis: int + einzelpreis(): int * + einzelpreis(p: int) + positionspreis(): int für 1 Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Artikel – name: String – preis: int b1.sonderpreis(1,50); b1.print(); // Gesamtpreis 1050, weil Tisch billiger } + preis(): int Objektoiertierte Programmierung K3 - 25 Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) „Naive Realisierung“ mit Arrays (1) K3 - 26 „Naive Realisierung“ mit Arrays (2) class Bestellung { public void sonderpreis (int pos, int preis) { liste[pos].einzelpreis(preis); } private String kunde; private Bestellposition[] liste; private int anzahl = 0; public Bestellung(String kunde) { this.kunde = kunde; liste = new Bestellposition[20]; } public void neuePosition (Bestellposition b) { // was passiert bei mehr als 20 Positionen ? liste[anzahl] = b; anzahl++; } } Objektoiertierte Programmierung public int auftragssumme() { int s = 0; for(int i=0; i<anzahl; i++) s += liste[i].positionspreis(); return s; Bestellungs-Methoden } abgestützt auf ... Bestellpositions-Methoden „Dynamische Arrays“ ? Erforderlich wäre: 1. Obergrenze erweiterbar 2. Automatisches Zusammenschieben beim Löschen public void loeschePosition (int pos) { // ist mit Arrays nicht einfach zu realisieren ! } Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K3 - 27 Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Klassifikation von Java-Datenstrukturen Objektoiertierte Programmierung K3 - 28 Java Collection Framework: Struktur • Collection (Kollektion): <<interface>> – Ansammlung von Datenelementen – Hinzufügen, Entfernen, Suchen, Durchlaufen Collection • Set (Menge): – Mehrfachvorkommen spielen keine Rolle – Reihenfolge des Einfügens spielt keine Rolle – SortedSet (geordnete Menge): Ordnung auf den Elementen <<interface>> List • List (Liste): <<interface>> Set Keine Collection!! <<interface>> Map – Mehrfachvorkommen werden separat abgelegt – Reihenfolge des Einfügens bleibt erhalten • Map (Abbildung): – Zuordnung von Schlüsselwerten auf Eintragswerte – Mehrfachvorkommen bei Schlüsseln verboten, bei Einträgen erlaubt – SortedMap (geordnete Abbildung): Ordnung auf den Schlüsseln Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung <<interface>> SortedSet K3 - 29 Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Seite 5 <<interface>> SortedMap Objektoiertierte Programmierung K3 - 30 java.util.Collection (Auszug aus Protokoll) java.util.List (Auszug) public interface List extends Collection { public interface Collection { public public public public public public ... public public public public public public public ... public public public public boolean add (Object o); boolean remove (Object o); void clear(); boolean isEmpty(); boolean contains (Object o); int size(); Iterator iterator(); } boolean add (Object o); boolean remove (Object o); void clear(); boolean isEmpty(); boolean contains (Object o); int size(); zusätzlich Zugriff per Index Object get (int index); Object set (int index, Object element); boolean remove (int index); int indexOf (Object o); } Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K3 - 31 Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) 1. Implementierung: java.util.ArrayList (Auszug) Objektoiertierte Programmierung K3 - 32 Anwendungsbeispiel mit ArrayList (1) import java.util.ArrayList; ... class Bestellung { private String kunde; private ArrayList liste; private int anzahl = 0; public class ArrayList implements List { public boolean add (Object o); public boolean remove (Object o); //exception! public void clear(); public boolean isEmpty(); public boolean contains (Object o); public int size(); ... public Object get (int index); public Object set (int index, Object element) public boolean remove (int index); public int indexOf (Object o); implementierungs... spezifisch! public Bestellung(String kunde) { this.kunde = kunde; liste = new ArrayList(); } public void neuePosition (Bestellposition b) { liste.add(b); } public void loeschePosition (int pos) { liste.remove(pos); Methoden aus Collection } ... verwendet public ArrayList (int initialCapacity); public void ensureCapacity (int minCapacity); } Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K3 - 33 Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Anwendungsbeispiel mit ArrayList (falsch!) Objektoiertierte Programmierung „Generisches“ Programmieren Bestellung – kunde: String – anzahl: int ... public void sonderpreis (int pos, int preis) { liste.get(pos).einzelpreis(preis); } ... Methode aus List 1 Object java.util.ArrayList add(Object o) get(pos: int): Object liste ... Zusicherung: Alle von einem Bestellung-Objekt über die liste-Assoziation erreichbaren Objekte sind aus der Klasse Bestellposition. • Compilermeldung: „Method einzelpreis(int) not found in class java.lang.Object.“ * K3 - 34 * Bestellposition Typanpassung (cast): liste.get(pos).einzelpreis(preis); Explizite Typanpassung (dynamic cast) erforderlich,wenn Operationen der Unterklasse auf Objekte anzuwenden sind, die sich in Variablen einer Oberklasse befinden: Object-Speicherplatz! ( Typ ) Variable • Lösung mit „cast“ auf nächster Folie!! Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) hier: (Bestellposition)liste.get(i) Objektoiertierte Programmierung K3 - 35 Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Seite 6 Objektoiertierte Programmierung K3 - 36 Anwendungsbeispiel mit ArrayList (2) Iterator-Konzept • Aufzählen der in einem “Behälter” befindlichen Elemente public void sonderpreis (int pos, int preis) { ((Bestellposition)liste.get(pos)).einzelpreis(preis); } – Keine Aussage über die Reihenfolge! – Interface java.util.Iterator public int auftragssumme() { int s = 0; for(int i=0; i<liste.size(); i++) s += ((Bestellposition)liste.get(i)).positionspreis(); return s; } } interface Iterator { public abstract boolean hasNext(); public abstract Object next(); public void remove(); } Verwendungsbeispiel: public void print () { System.out.println("Bestellung fuer Kunde "+kunde); for(int i=0; i<liste.size(); i++) System.out.println(liste.get(i)); System.out.println("Gesamt: "+auftragssumme()+„\n"); } • Erzeugung eines Iterators für eine beliebige Kollektion (deklariert in java.util.Collection): public Iterator iterator(); Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K3 - 37 Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Anwendungsbeispiel mit Iteratoren Objektoiertierte Programmierung K3 - 38 2. Implementierung: java.util.LinkedList (Auszug) public class LinkedList implements List { public boolean add (Object o); public boolean remove (Object o); public void clear(); public boolean isEmpty(); public boolean contains (Object o); public int size(); public Object get (int index); public Object set (int index, Object element) public boolean remove (int index); public int indexOf (Object o); implementierungs... spezifisch! import java.util.Iterator; ... class Bestellung { private String kunde; private ArrayList liste; } Iterator i = ...; while (i.hasNext()) { doSomeThing(i.next());} ... Auch hier ist ein public int auftragssumme() { Cast erforderlich!! Iterator i = liste.iterator(); int s = 0; while (i.hasNext()) s += ((Bestellposition)i.next()).positionspreis(); return s; } ... public void addFirst (Object o); public void addLast (Object o); } Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K3 - 39 Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Wechsel der Datenstruktur ist einfach! • ArrayList: class Bestellung { private String kunde; private List liste; public Bestellung(String kunde) { this.kunde = kunde; liste = new ArrayList(); } ... public interface Map { ... public boolean containsKey (Object key); public boolean containsValue (Object value); public Object get (Object key); public Object put (Object key, Object value); public Object remove (Object key); public int size(); public Set keySet(); public Collection values(); ... Schlüsselmenge und Wertemenge } class Bestellung { Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Nur im Konstruktor eine Instantiierung ändern ! Objektoiertierte Programmierung K3 - 40 java.util.Map (Auszug) List ist ein Interface, keine Klasse ! • LinkedList: private String kunde; private List liste; public Bestellung(String kunde) { this.kunde = kunde; liste = new LinkedList(); } ... Objektoiertierte Programmierung sind jeweils Collections! „Assoziativer Speicher“ oder „Wörterbuch“ K3 - 41 Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Seite 7 Objektoiertierte Programmierung K3 - 42 Anwendungsbeispiel Anwendungsbeispiel mit HashMap class Katalog { Katalog – name: String + put (code: String, a: Artikel) + get (code: String): Artikel + anzahl(): int private String name; // des Katalogs private Map inhalt; // die Eintraege Map: code -> Artikel ordnet jedem code seinen Artikel zu. code: String * 1 Artikel – name: String – preis: int + preis(): int } Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K3 - 43 Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Suche nach vorgefertigten Lösungen Collection ja List Sortierung relevant? SortedSet kleinstes / größtes Element Elemente "über" / "unter" x Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K3 - 45 assoc * 1) Einfügen (ohne Reihenfolge) 2) Assoziation entfernen 2) Entfernen (ohne Reihenfolge) 3) Durchlaufen aller bestehenden Assoziationen zu B-Objekten 3) Aufzählen aller Elemente (per Iterator) 4) Manchmal: Abfrage, ob Assoziation zu einem B-Objekt besteht 4) "ist enthalten"-Abfrage 5) Keine Obergrenze der Multiplizität gegeben 5) dynamischer Erweiterbarkeit Objektoiertierte Programmierung K3 - 46 Beispiel zu Set-Assoziationen (Teil 1) Teambesprechung B * teilnahme * Teammitglied name abteilung import java.util.Set; import java.util.HashSet; import java.util.Iterator; ... class A { private Set assoc; ... class Teammitglied { private String name; private String abteilung; private Set teilnahme; public void addAssoc (B b) { assoc.add(b); } public void teilnahmeSetzen (Teambesprechung b) { teilnahme.add(b); } public boolean testAssoc (B b) { return assoc.contains(b); } public A { ... assoc = new HashSet(); } } Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) dann Datenstruktur mit ... 1) Assoziation anlegen Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) z. B. Realisierung von Assoziationen mit Set A B assoc Wenn ... gebraucht, SortedMap Set Abfrage an i-ter Position Ersetzen an i-ter Position Entfernen an i-ter Position K3 - 44 Datenstruktur im A-Objekt für B-Referenzen Sortierung der Schlüssel relevant? nein * A Einfügen eines Werts für einen Schlüssel Entfernen eines Schlüssel/Wert-Paars Abfrage eines Werts für einen Schlüssel "ist enthalten"-Abfrage für Schlüssel dynamisch erweiterbar Einfügereihenfolge relevant? Objektoiertierte Programmierung Allgemeinere Realisierung von Assoziationen Map Einfügen eines Elements Entfernen eines Elements Aufzählen aller Elemente "ist enthalten"-Abfrage dynamisch erweiterbar public Katalog (String name) { this.name = name; this.inhalt = new HashMap(); // implementiert Map } public void put (String code, Artikel a) { inhalt.put(code,a); } public int anzahl() { return inhalt.size(); } public Artikel get (String code) { return (Artikel)inhalt.get(code); } ... Objektoiertierte Programmierung K3 - 47 public Teammitglied (String name, String abteilung) { this.name = name; this.abteilung = abteilung; this.teilnahme = new HashSet(); } ... Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Seite 8 Objektoiertierte Programmierung K3 - 48 Beispiel zu Set-Assoziationen (Teil 2) Beispiel: Raumverwaltung static Besprechungsraum freienRaumSuchen (int groesse, Hour beginn, int dauer) class Teammitglied { ... • Suche unter vorhandenen Räumen nach Raum mit mindestens der Kapazität groesse, aber möglichst klein. public boolean terminBestaetigen (Date beginn,int dauer) { } ... } – Datenstruktur für vorhandene Räume in Klasse Raumverwaltung » SortedSet (Elemente: Besprechungsraum) boolean konflikt = false; Iterator it = teilnahme.iterator(); while (it.hasNext() && !konflikt) { Teambesprechung b = (Teambesprechung)it.next(); if (b.inKonflikt(beginn, dauer)) konflikt = true; }; return !konflikt; • Überprüfung eines Raumes, ob er für die Zeit ab beginn für die Länge dauer bereits belegt ist. – Operation in Klasse Besprechungsraum: boolean frei (Hour beginn, int dauer) – Datenstruktur in Klasse Besprechungsraum für Zeiten (Stunden): » Set (Elemente: Hour) • Zusatzanforderung (Variante): Überprüfung, welcher andere Termin eine bestimmte Stunde belegt. – Datenstruktur in Klasse Besprechungsraum: » Map (Schlüssel: Hour, Wert: Teambesprechung) Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K3 - 49 Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Raumverwaltung: Freien Raum suchen class Raumverwaltung { private static SortedSet vorhandeneRaeume = new TreeSet(); // vorhandene Raeume, aufsteigend nach Groesse sortiert static Besprechungsraum freienRaumSuchen (int groesse, Hour beginn, int dauer) { Besprechungsraum r = null; boolean gefunden = false; Iterator it = vorhandeneRaeume.iterator(); while (! gefunden && it.hasNext()) { r = (Besprechungsraum)it.next(); if (r.grossGenug(groesse)&&r.frei(beginn,dauer)) gefunden = true; }; return r; // also null, falls nicht gefunden } ... } Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K3 - 51 Seite 9 Objektoiertierte Programmierung K3 - 50