Begreber og Redskaber 9
Plan for idag I dag: Datastrukturer Tabeller Lister, mængder, maps, grafer Hægtede lister
Tabeller Person tabel[] = new Person[100]; tabel[0] = new person(”Mads Rosendahl”); …. osv Tabeller er gode hvis man har en rimelig viden om maksimalt antal elementer. Bedst hvis der tilføjes, men ikke fjernes elementer
Datastruktur Indsæt element Fjern element Søg efter elementer Datastruktur Indsæt Fjern Søg
Datastrukturer: lister Lister –Elementer i en rækkefølge –Indsæt først eller sidst –Gennemløb i rækkefølge –Eksempel: Stak: Sidst ind først ud Sæt ind og tag ud fra samme ende –Eksempel: Kø: Først ind først ud Sæt ind i den ene ende og tag ud fra den anden –Eksempel: Dequeue. Man kan sætte ind og tage ud fra begge ender.
Datastrukturer: Mængder Samling af elementer, typisk sorteret eller ordnet efter elementernes værdi (f.eks en nøgle) Eksempel: Hob – Rå samling Eksempel: Mængde – et element kan højst være der en gang Eksempel: Ordnet mængde Eksempel: Samling af personer sorteret efter cpr nummer
Datastrukturer: grafer Grafer: elementer kender/refererer til visse andre F.eks punkter/byer med afstande. Mere generelt: Databaser med elementer hvor der kan søges med forespørgsler
Lister Samling af objekter [109, 27, 67, 78, 15 ] [Karl Børge, Knud, Orla] Elementerne står i en rækkefølge
LinkedList og Link
Class Link og LinkedList class Link { Object data; Link next; } public class LinkedList{ private Link first; public LinkedList(){ first = null; } public void addFirst(Object obj){ Link newLink = new Link(); newLink.data = obj; newLink.next = first; first = newLink; }
Figure 4 Adding a Link to the Head of a Linked List Indsæt først i listen
Figure 5 Removing a Link from the Head of a Linked List Fjern første element i liste
Hent første, fjern første public Object getFirst(){ if (first == null) throw new NoSuchElementException(); return first.data; } public Object removeFirst(){ if (first == null) throw new NoSuchElementException(); Object obj = first.data; first = first.next; return obj; }
Iterator En ”Iterator” giver måde at gennemløbe en liste på interface ListIterator { Object next(); boolean hasNext(); void add(Object obj); void remove(); void set(Object obj); } F.eks. int i=0; ListIterator lit = lst.listIterator(); while(lit.hasNext()){ Object elm = lit.next(); i++; System.out.println(i+": "+elm); }
Figure 2 A List Iterator Iterator
LinkedListIterator class LinkedListIterator implements ListIterator{ LinkedList list; Link position; Link previous; public LinkedListIterator(LinkedList list){ this.list = list; position = null; previous = null; }
next, hasnext public Object next(){ if (!hasNext()) throw new NoSuchElementException(); previous = position; // remember for remove if (position == null) position = list.first; else position = position.next; return position.data; } public boolean hasNext(){ if (position == null) return list.first != null; else return position.next != null; }
Figure 7 Adding a Link to the Middle of a Linked List Indsæt element
public void add(Object obj){ if (position == null) { list.addFirst(obj); position = list.first; } else { Link newLink = new Link(); newLink.data = obj; newLink.next = position.next; position.next = newLink; position = newLink; } previous = null; }
Figure 6 Removing a Link from the Middle of a Linked List Fjern element
public void remove(){ if (position == list.first){ list.removeFirst(); position = list.first; } else { if (previous == null) throw new IllegalStateException(); previous.next = position.next; position = previous; } previous = null; }
Indre klasser Man kan have klasser inde i klasser. Et objekt af den indre klasse kender så til variable i objektet for den ydre klasse. public class LinkedList{ public ListIterator listIterator(){ return new LinkedListIterator(); } private class LinkedListIterator implements ListIterator {.. }