Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Rückblick: Liste und Element

Ähnliche Präsentationen


Präsentation zum Thema: "Rückblick: Liste und Element"—  Präsentation transkript:

1 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 Referenz this Anmerkungen: this ist in jeder Klasse verfügbar.
this ist eine Referenz auf das durch die Klasse definierte Objekt. this

21 So bekannt! 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 w a anfang 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 a anfang

23 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 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 a doppelt verkettete Liste

25 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 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 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 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 Vererbung Das Spezialisieren von allgemeinen Klassen wird ermöglicht durch das Konzept der Vererbung

30 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 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 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 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 Vererbung bedeutet: 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 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 nächste Woche Fragen Antworten: 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 "Rückblick: Liste und Element"

Ähnliche Präsentationen


Google-Anzeigen