Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

PKJ 2005/1 Stefan Dissmann Rückblick: Liste und Element public class IntElement { private int wert; private IntElement nachfolger; public IntElement(int.

Ähnliche Präsentationen


Präsentation zum Thema: "PKJ 2005/1 Stefan Dissmann Rückblick: Liste und Element public class IntElement { private int wert; private IntElement nachfolger; public IntElement(int."—  Präsentation transkript:

1 PKJ 2005/1 Stefan Dissmann Rückblick: Liste und Element public class IntElement { private int wert; private IntElement nachfolger; public IntElement(int w) { wert = w; nachfolger = null; } public void verkette(IntElement n) { nachfolger = n; }

2 PKJ 2005/2 Stefan Dissmann Rückblick: Liste und Element public class IntListe { private IntElement anfang, ende; public IntListe() {…}; public void fügeAn(int w) {…}; public int gibErstes() {…}; public void löscheErstes() {…}; public boolean leer() {…}; }

3 PKJ 2005/3 Stefan Dissmann Lösungen zu Übungsblatt 8 Musterlösungen zu zwei Teilaufgaben der Übung 8: l)Schreiben Sie eine Methode verlängere, die eine Kopie einer als Parameter übergebenen Liste an die bestehende Liste anhängt. Die übergebene Liste soll dabei unverändert bleiben. o)Schreiben Sie eine Methode lösche mit einer ganzen Zahl als Parameter. Diese Methode soll in der Liste alle Werte löschen, die dem übergebenen Wert entsprechen. Beachten Sie alle Sonderfälle!

4 PKJ 2005/4 Stefan Dissmann Lösungen zu Übungsblatt 8 public void verlängere(IntListe il) { IntListe neu = il.kopiere(); if (!leer()) { ende.verkette(neu.anfang); } else { anfang = neu.anfang; } ende = neu.ende; größe = größe + neu.größe; // aus e) }

5 PKJ 2005/5 Stefan Dissmann Lösungen zu Übungsblatt 8 public void verlängere(IntListe il) { IntListe neu = il.kopiere(); if (!leer()) { ende.verkette(neu.anfang); } else { anfang = neu.anfang; } ende = neu.ende; größe = größe + neu.größe; // aus e) } il unverändert lassen!

6 PKJ 2005/6 Stefan Dissmann Lösungen zu Übungsblatt 8 public void verlängere(IntListe il) { IntListe neu = il.kopiere(); if (!leer()) { ende.verkette(neu.anfang); } else { anfang = neu.anfang; } ende = neu.ende; größe = größe + neu.größe; // aus e) } Kapselung???

7 PKJ 2005/7 Stefan Dissmann Kapselung in JAVA Objekt in JAVA entspricht nicht der intuitiven Vorstellung einer Kapsel. Kapselung und Geheimnisprinzip ( private ) gelten nur für Objekte aller anderen Klassen. Objekte der eigenen Klasse haben freien Zugang zu allen privaten Attributen und Methoden. Daher im Bsp. möglich: ende = neu.ende;

8 PKJ 2005/8 Stefan Dissmann Lösungen zu Übungsblatt 8 public void lösche(int w) {…} Probleme: In leerer Liste kein Löschen. Referenzen auf Anfang und Ende korrigieren. Wenn Element gelöscht wird, Vorgänger mit Nachfolger verbinden. Besonderes Problem: Wenn ein Element erreicht ist, gibt es keinen Weg zurück zum Vorgänger. deshalb: von Vorgänger ausgehend Nachfolger inspizieren.

9 PKJ 2005/9 Stefan Dissmann Lösungen zu Übungsblatt 8 public void lösche(int w) { if (!leer()) { if (anfang != ende) { IntElement lauf = anfang; while (lauf != ende) { if (lauf.gibNachfolger().gibWert() == w) { if (lauf.gibNachfolger() == ende) { ende = lauf; } lauf.verkette(lauf.gibNachfolger().gibNachfolger()); größe--; } else { lauf = lauf.gibNachfolger(); } } } if (gibErstes() == w) { löscheErstes(); größe--;// aus e) } } }

10 PKJ 2005/10 Stefan Dissmann Lösungen zu Übungsblatt 8 public void lösche(int w) { if (!leer()) { if (anfang != ende) { IntElement lauf = anfang; while (lauf != ende) { if (lauf.gibNachfolger().gibWert() == w) { if (lauf.gibNachfolger() == ende) { ende = lauf; } lauf.verkette(lauf.gibNachfolger().gibNachfolger()); größe--; } else { lauf = lauf.gibNachfolger(); } } } if (gibErstes() == w) { löscheErstes(); größe--;// aus e) } } } nur wenn nicht leer!

11 PKJ 2005/11 Stefan Dissmann Lösungen zu Übungsblatt 8 public void lösche(int w) { if (!leer()) { if (anfang != ende) { IntElement lauf = anfang; while (lauf != ende) { if (lauf.gibNachfolger().gibWert() == w) { if (lauf.gibNachfolger() == ende) { ende = lauf; } lauf.verkette(lauf.gibNachfolger().gibNachfolger()); größe--; } else { lauf = lauf.gibNachfolger(); } } } if (gibErstes() == w) { löscheErstes(); größe--;// aus e) } } } nur wenn >= 2 Elemente!

12 PKJ 2005/12 Stefan Dissmann Lösungen zu Übungsblatt 8 public void lösche(int w) { if (!leer()) { if (anfang != ende) { IntElement lauf = anfang; while (lauf != ende) { if (lauf.gibNachfolger().gibWert() == w) { if (lauf.gibNachfolger() == ende) { ende = lauf; } lauf.verkette(lauf.gibNachfolger().gibNachfolger()); größe--; } else { lauf = lauf.gibNachfolger(); } } } if (gibErstes() == w) { löscheErstes(); größe--;// aus e) } } } für fast alle Elemente!

13 PKJ 2005/13 Stefan Dissmann Lösungen zu Übungsblatt 8 public void lösche(int w) { if (!leer()) { if (anfang != ende) { IntElement lauf = anfang; while (lauf != ende) { if (lauf.gibNachfolger().gibWert() == w) { if (lauf.gibNachfolger() == ende) { ende = lauf; } lauf.verkette(lauf.gibNachfolger().gibNachfolger()); größe--; } else { lauf = lauf.gibNachfolger(); } } } if (gibErstes() == w) { löscheErstes(); größe--;// aus e) } } } Treffer!

14 PKJ 2005/14 Stefan Dissmann Lösungen zu Übungsblatt 8 public void lösche(int w) { if (!leer()) { if (anfang != ende) { IntElement lauf = anfang; while (lauf != ende) { if (lauf.gibNachfolger().gibWert() == w) { if (lauf.gibNachfolger() == ende) { ende = lauf; } lauf.verkette(lauf.gibNachfolger().gibNachfolger()); größe--; } else { lauf = lauf.gibNachfolger(); } } } if (gibErstes() == w) { löscheErstes(); größe--;// aus e) } } } Kein Treffer!

15 PKJ 2005/15 Stefan Dissmann Lösungen zu Übungsblatt 8 public void lösche(int w) { if (!leer()) { if (anfang != ende) { IntElement lauf = anfang; while (lauf != ende) { if (lauf.gibNachfolger().gibWert() == w) { if (lauf.gibNachfolger() == ende) { ende = lauf; } lauf.verkette(lauf.gibNachfolger().gibNachfolger()); größe--; } else { lauf = lauf.gibNachfolger(); } } } if (gibErstes() == w) { löscheErstes(); größe--;// aus e) } } } Und noch das erste Element!

16 PKJ 2005/16 Stefan Dissmann Weitere Methode für IntListe Aufgabe: Die Methode void zweimal() soll eine Liste einmal um sich selbst verlängern, so dass anschließend alle Elemente zweimal in der gleichen Reihenfolge auftreten.

17 PKJ 2005/17 Stefan Dissmann Weitere Methode für IntListe Aufgabe: Die Methode void zweimal() soll eine Liste einmal um sich selbst verlängern, so dass anschließend alle Elemente zweimal in der gleichen Reihenfolge auftreten. Lösung: Sieht einfach aus, da wir ja schon verlängere als Methode haben.

18 PKJ 2005/18 Stefan Dissmann Weitere Methode für IntListe Aufgabe: Die Methode void zweimal() soll eine Liste einmal um sich selbst verlängern, so dass anschließend alle Elemente zweimal in der gleichen Reihenfolge auftreten. Lösung: public class IntListe { public void zweimal() { verlängere(ich-selbst); } … }

19 PKJ 2005/19 Stefan Dissmann Weitere Methode für IntListe Aufgabe: Die Methode void zweimal() soll eine Liste einmal um sich selbst verlängern, so dass anschließend alle Elemente zweimal in der gleichen Reihenfolge auftreten. Lösung: public class IntListe { public void zweimal() { verlängere(this); } … }

20 PKJ 2005/20 Stefan Dissmann Referenz this Anmerkungen: this ist in jeder Klasse verfügbar. this ist eine Referenz auf das durch die Klasse definierte Objekt. this

21 PKJ 2005/21 Stefan Dissmann Referenz this Anmerkungen: this ist in jeder Klasse verfügbar. this ist eine Referenz auf das durch die Klasse definierte Objekt. this kann auch benutzt werden, um Namenskonflikte zu lösen: private IntElement anfang, ende; public IntListe(int w) { anfang = ende = new IntElement(w); } this So bekannt!

22 PKJ 2005/22 Stefan Dissmann Referenz this Anmerkungen: this ist in jeder Klasse verfügbar. this ist eine Referenz auf das durch die Klasse definierte Objekt. this kann auch benutzt werden, um Namenskonflikte zu lösen: private IntElement anfang, ende; public IntListe(int anfang) { this.anfang = ende = new IntElement(anfang); } this w anfang

23 PKJ 2005/23 Stefan Dissmann Kritische Betrachtung Defizite unserer IntListe : Durch die einseitige Richtung der Verkettung werden vorausschauende Algorithmen benötigt. Manche Operationen sind sehr aufwändig, z.B. alle von hinten beginnenden Durchläufe.

24 PKJ 2005/24 Stefan Dissmann Kritische Betrachtung Defizite unserer IntListe : Durch die einseitige Richtung der Verkettung werden vorausschauende Algorithmen benötigt. Manche Operationen sind sehr aufwändig, z.B. alle von hinten beginnenden Durchläufe. Lösung: Verkettung in beide Richtungen doppelt verkettete Liste

25 PKJ 2005/25 Stefan Dissmann Doppelt verkettete Liste: IntElement2 public class IntElement2 { private int wert; private IntElement2 vorgänger, nachfolger; public IntElement2(int w) { wert = w; vorgänger = nachfolger = null; } … }

26 PKJ 2005/26 Stefan Dissmann Doppelt verkettete Liste: IntElement2 public class IntElement2 { private int wert; private IntElement2 vorgänger, nachfolger; public IntElement2(int w) { wert = w; vorgänger = nachfolger = null; } public void verkette(IntElement2 n) { if (n != null) { nachfolger = n; n.vorgänger = this; } public IntElement2 gibVorgänger() { return vorgänger; } public IntElement2 gibNachfolger() { return nachfolger; } public int gibWert() { return wert; } }

27 PKJ 2005/27 Stefan Dissmann Kritische Betrachtung (Fortsetzung) Bisher implementiert: Liste für Werte des Typs int Liste für double Liste für Studierende Liste von Listen von int Erfordern jeweils neue, fast identische Implementierung der Klassen für Elemente und Liste.

28 PKJ 2005/28 Stefan Dissmann Kritische Betrachtung (Fortsetzung) Analyse: Elemente haben immer Referenzen auf Vorgänger und Nachfolger. Liste verknüpft, löscht und durchläuft immer Elemente. Elemente unterscheiden sich im Typ der abgelegten Werte. Liste benötigt möglicherweise typspezifische Vergleiche. Idee: Elemente und Liste allgemein formulieren und anschließend nur an wenigen Stellen spezialisieren.

29 PKJ 2005/29 Stefan Dissmann Vererbung Das Spezialisieren von allgemeinen Klassen wird ermöglicht durch das Konzept der Vererbung

30 PKJ 2005/30 Stefan Dissmann Vererbung Wenn eine Klasse A die Klasse B spezialisiert, Also die Klasse A von der Klasse B erbt, übernimmt sie alle Attribut- und Methoden-Deklarationen von B. A heißt dann Unterklasse von B oder Subklasse von B B heißt dann Oberklasse von A oder Superklasse von A

31 PKJ 2005/31 Stefan Dissmann Vererbung Beispiel: public class Person { private String name, vorname; public Person(String n, String v) { name = n; vorname = v; } public String toString() { return name + ", " + vorname }

32 PKJ 2005/32 Stefan Dissmann Vererbung Beispiel: public class Person { private String name, vorname; public Person(String n, String v) { name = n; vorname = v; } public String toString() { return name + ", " + vorname } public class Kunde extends Person {{ private int nummer; }

33 PKJ 2005/33 Stefan Dissmann Vererbung Beispiel: public class Person { private String name, vorname; public Person(String n, String v) { name = n; vorname = v; } public String toString() { return name + ", " + vorname } public class Kunde extends Person { private int nummer; }

34 PKJ 2005/34 Stefan Dissmann Vererbung public class Kunde extends Person {{ private int nummer; } bedeutet: Kunde wird als Unterklasse von Person definiert. Person wird dadurch Oberklasse von Kunde. Kunde hat geerbt: die öffentliche Methode toString, die privaten Attribute name und vorname. In Kunde wird definiert: das private Attribut nummer.

35 PKJ 2005/35 Stefan Dissmann Fragen Was geht wie in der Klasse Kunde? Zugriff auf die geerbten privaten Attribute name und vorname. Gemeinsame Ausgabe aller drei Attribute. Definition eines Konstruktors für alle drei Attribute. Zulässigkeit von Referenzen auf Ober- und Unterklasse.

36 PKJ 2005/36 Stefan Dissmann Fragen Was geht wie in der Klasse Kunde? Zugriff auf die geerbten privaten Attribute name und vorname. Gemeinsame Ausgabe aller drei Attribute. Definition eines Konstruktors für alle drei Attribute. Zulässigkeit von Referenzen auf Ober- und Unterklasse. Antworten: nächste Woche


Herunterladen ppt "PKJ 2005/1 Stefan Dissmann Rückblick: Liste und Element public class IntElement { private int wert; private IntElement nachfolger; public IntElement(int."

Ähnliche Präsentationen


Google-Anzeigen