Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

FH-Hof Listen Richard Göbel. FH-Hof Beispiel Studenten einer Vorlesung Datentyp Array public class Vorlesung { String bezeichnung; Dozent dozent; intsws;

Ähnliche Präsentationen


Präsentation zum Thema: "FH-Hof Listen Richard Göbel. FH-Hof Beispiel Studenten einer Vorlesung Datentyp Array public class Vorlesung { String bezeichnung; Dozent dozent; intsws;"—  Präsentation transkript:

1 FH-Hof Listen Richard Göbel

2 FH-Hof Beispiel Studenten einer Vorlesung Datentyp Array public class Vorlesung { String bezeichnung; Dozent dozent; intsws; intects; Student[]teilnehmer; int anzTeilnehmer; } Ansatz Array Wahl der Größe des Array? Vergrößerung des Array?

3 FH-Hof Darstellung - Anfangsgröße Maximale Größe oder typische Größe wählen? Studenten für jede Vorlesung speichern: Typische Größe: 40? Maximale Größe: 50, 100, 200?

4 FH-Hof Speicherplatzverbrauch – Beispiel Teilnehmer

5 FH-Hof Alternativer Ansatz Erzeugen eines Arrays mit einer typische Größe Vergrößern der Kapazität des Arrays: Erzeugung eines neuen Arrays Kopieren der vorhandenen Elemente in das neue Array Ersetzen des alten durch das neue Array Wie sollte die Größe eines Array wachsen? um ein Element? um eine konstante Zahl (z.B. 10)? um einen konstanten Faktor (also exponentiell)? Standardlösung: ArrayList

6 FH-Hof ArrayList- Übersicht Datentyp Konstruktoren Kapazität Vergrößern Objekt einfügen Objekt lesen Objekt ersetzen Beispiele

7 FH-Hof ArrayList - Attribute public class ArrayList { private E[] elementData; private int size; public int size() { return size; }... }

8 FH-Hof ArrayList - Konstruktoren public ArrayList(int initialCapacity) { if (initialCapacity < 0) throw new IllegalArgumentException( "Illegal Capacity: + initialCapacity); elementData = (E[]) new Object[initialCapacity]; } public ArrayList() { this(10); }

9 FH-Hof ArrayList - Kapazität Vergrößern public void ensureCapacity(int minCapacity) { int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; elementData = (E[]) new Object[newCapacity]; System.arraycopy( oldData,0,elementData,0, size); }

10 FH-Hof ArrayList - Objekt einfügen public boolean add(E o) { ensureCapacity(size + 1); elementData[size++] = o; return true; }

11 FH-Hof ArrayList - Objekt lesen public E get(int index) { if (index =size) throw new IndexOutOfBoundsException( "Index: "+index+", Size: "+size); return elementData[index]; }

12 FH-Hof ArrayList - Objekt ersetzen public E add(int index, E element) { if (index =size) throw new IndexOutOfBoundsException( "Index: "+index+", Size: "+size); E oldValue = elementData[index]; elementData[index] = element; return oldValue; }

13 FH-Hof ArrayList – Beispiel I ArrayList l = new ArrayList (); for (int i = 0; i < 100; i++) { l.add("Element " + i); System.out.println(i + ": " + l.get(i)); System.out.println("size: " + l.size()); System.out.println( "capacity: " + l.toArray().length); }

14 FH-Hof ArrayList – Beispiel II l.add(150, "Element 150"); System.out.println("150: " + l.get(150)); System.out.println("size: " + l.size()); System.out.println( "capacity: " + l.toArray().length); l.add(1000, "Element 1000"); System.out.println("1000: " + l.get(150)); System.out.println("size: " + l.size()); System.out.println( "capacity: " + l.toArray().length);

15 FH-Hof ArrayList - Diskussion Niedriger durchschnittlicher Zeitaufwand für das Einfügen O(1), (schlechtester Fall: O(n)) und den wahlfreien Zugriff O(1) Geringer zusätzlicher Verbrauch an Speicherplatz Hoher Kopieraufwand speziell bei dem Vergrößern großer Listen

16 FH-Hof LinkedList - Konzept Motivation: Verkettete Listen vermeiden Kopieraufwand beim Einfügen Für jedes Objekt der Liste existiert ein Listenobjekt mit drei Referenzen Jeweils eine Referenz verweist auf Vorgänger und Nachfolger in der Liste Eine Referenz verweist auf das enthaltene Element

17 FH-Hof Verkettete Liste - Attribute und Konstruktor public class LinkedList { private Entry header = new Entry (null, null, null); private int size = 0; public LinkedList() { header.next = header.previous = header; } public int size() { return size; }... }

18 FH-Hof Listenelement - Attribute und Konstruktor private static class Entry { E element; Entry next; Entry previous; Entry(E element, Entry next, Entry previous) { this.element = element; this.next = next; this.previous = previous; } }

19 FH-Hof LinkedList - Attribut eines Listenelements String element; Entry next; Entry previous; abcdefghi

20 FH-Hof Klasse LinkedList - Methode add public boolean add(E o) { addBefore(o, header); return true; } private Entry addBefore(E o, Entry e) { Entry newEntry = new Entry (o, e, e.previous); newEntry.previous.next = newEntry; newEntry.next.previous = newEntry; size++; return newEntry; }

21 FH-Hof Klasse LinkedList - Methode get public E get(int index) { return entry(index).element; } private Entry entry(int index) { if (index = size) throw new IndexOutOfBoundsException(…); Entry e = header; if (index > 1)) { for (int i = 0; i <= index; i++) e = e.next; } else { for (int i = size; i > index; i--) e = e.previous; } return e; }

22 FH-Hof Klasse LinkedList - Methode set public E set(int index, E element) { Entry e = entry(index); E oldVal = e.element; e.element = element; return oldVal; }

23 FH-Hof LinkedList - Beispiel LinkedList l = new LinkedList (); for (int i = 0; i < 5; i++) { l.add("Element " + i); System.out.println(i + ": " + l.get(150)); System.out.println ("size: " + l.size()); } l.set(10, "Element 10");

24 FH-Hof LinkedList - Diskussion Niedriger Zeitaufwand für das Einfügen O(1) Hoher Aufwand für den wahlfreien Zugriff O(n) Für jedes Element der Liste wird genau ein Objekt der Klasse Entry benötigt.


Herunterladen ppt "FH-Hof Listen Richard Göbel. FH-Hof Beispiel Studenten einer Vorlesung Datentyp Array public class Vorlesung { String bezeichnung; Dozent dozent; intsws;"

Ähnliche Präsentationen


Google-Anzeigen