Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

Programmering i Java versjon januar 2005 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.

Liknende presentasjoner


Presentasjon om: "Programmering i Java versjon januar 2005 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else."— Utskrift av presentasjonen:

1 Programmering i Java versjon januar 2005 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17 Datastrukturer og algoritmeteori Graferside 2 Listerside 3-6 Generiske typerside 7-8 Java API: Collection, List og LinkedListside 9-11 Køside 12 Stakkside 13 Rekursjonside 14 Trær inkl. binære søketrærside Java API: Map og TreeMapside Hashtabellerside Iteratorerside 28 Generiske typer, forts.Side 29-31

2 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 2 Grafer •Anvendelser –visualisering av datanettverk –logistikk –formell kartlegging av et objektorientert programsystem node kant En urettet graf En rettet og vektet graf

3 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 3 Lister •Dataene ordnes sekvensielt på tilsvarende måte som i en tabell •Aktuelle operasjoner på liste –Sett inn et element i listen: først, sist eller på en bestemt posisjon. –Fjern et element fra listen. –Gå gjennom alle elementene i listen. •Lister i forhold til tabeller –Begge datastrukturene holder orden på dataene i en bestemt rekkefølge. –Størrelsen på en liste er helt dynamisk, den endres ved at elementer settes inn og tas ut. En tabell kan ikke endre størrelse etter at den er opprettet. –Å finne et bestemt element i en liste kan ta tid på grunn av at en alltid må gå inn fra enden av listen. Ethvert element i en tabell kan aksesseres direkte ved hjelp av indeksen. Enkeltlenket listeDobbeltlenket liste

4 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 4 Noen listeoperasjoner i mer detalj •Å sette inn et element i slutten av listen •Å sette inn et element på en bestemt plass i listen (foran *) * * Hvorfor kan vi ikke gjøre de to operasjonene i motsatt rekkefølge?

5 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 5 Eksempel, en liste med navn class NavneElement { private NavneElement neste; private String navn; public NavneElement(String startNavn) { navn = startNavn; } public NavneElement(String startNavn, NavneElement startNeste) { navn = startNavn; neste = startNeste; } public String finnNavn() { return navn; } public NavneElement finnNeste() { return neste; } public void settNavn(String nyttNavn) { navn = nyttNavn; } public void settNeste(NavneElement nyNeste) { neste = nyNeste; } NavneElement neste navn finnNavn finnNeste settNavn settNeste neste PerLiseEliAnne null

6 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 6 Klassen Navneliste NavneListe førsteElement skrivUtAlleNavn settInnNavnTilSlutt søkEtterNavn slettNavn (toString()) Vis programliste 17.2 og 17.3 side Gjør oppgavene side 618

7 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 7 Generiske typer public class ArrayList extends AbstractList implements Cloneable, Collection, Iterable, List, RandomAccess, Serializable { public ArrayList( ) { // er ikke del av konstruktørnavnet … } public Type get(int index) {... } ArrayList minListe = new ArrayList (); typeargument typeparameter

8 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 8 Generiske listeklasser •Elementene i listen kan nå være av en hvilken som helst klassetype. Vis programliste 17.4 – 17.6 side

9 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 9 Interface java.util.Collection •Fellestrekk for klasser som implementerer dette interfacet: –en samling elementer av forskjellige typer –metoder (husk at vi foreløpig ikke har noen implementasjoner!) •public boolean add(Type add) •public boolean contains(Object obj) •public boolean containsAll(Collection annenSamling) •public boolean remove(Object obj) •public boolean removeAll(Collection samling) •public int size() •Samlinger kan klassifiseres etter to parametre –er duplikater tillatt? –er elementene ordnet? Duplikater ikke tillatt OrdnetIkke ordnet Duplikater tillatt Liste Hashtabell (selve tabellen, i mange tilfeller) Multimengde Mengde

10 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 10 Interfacet java.util.List •List er sub-interface til Collections: –Elementene skal være ordnet •List krever flere metoder implementert: –public void add(int posisjon, Type obj) –public Type set(int posisjon, Type obj) –public Type remove(int posisjon) –public Type get(int posisjon) •Virker det kjent? Klassen ArrayList implementerer dette interfacet. •Kan gjerne ha identiske data i en liste, og kanskje til og med flere referanser til det samme objektet (som i ArrayList). •Implementasjonen av add() bestemmer slike ting, det dikteres ikke av interfacet.

11 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 11 Klassen java.util.LinkedList •Implementerer List (og dermed også Collections) •Skal ha den ytelsen som man kan vente av en dobbeltlenket liste •Klassen tilbyr flere metoder enn det interfacet krever –public void addFirst(Type objekt) –public void addLast(Type objekt) –public Type removeFirst() –public Type removeLast() Gjør oppgaven side 626

12 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 12 Kø •En kø er en ordnet samling med data hvor data settes inn og tas ut et bestemt sted. •FIFO-kø –First In First Out •Operasjoner –sett inn et element –ta ut et element import java.util.*; class FIFOKo { private LinkedList liste = new LinkedList (); public void settInnElement(Type objekt) { liste.addLast(objekt); } public Type taUtElement() { return liste.removeFirst(); } public int finnAntallElementer() { return liste.size(); }

13 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 13 Stakk •En stakk er en LIFO-kø (Last In First Out) import java.util.*; class Stakk { private LinkedList liste = new LinkedList (); public void settInnElement(Type objekt) { // ”push” liste.addLast(objekt); } public Type taUtElement() { // ”pop” return liste.removeLast(); } public int finnAntallElementer() { return liste.size(); } Gjør oppgaven side 628

14 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 14 Rekursjon •Teknisk innebærer rekursjon at en metode kaller seg selv. •For at dette ikke skal gjenta seg i det uendelige må enhver rekursjon ha et stoppkriterium. •Eksempel: public int fakultet(int n) { if (n <= 1) return 1; // stopp-kriterium else return n * fakultet(n – 1); } Gjør oppgavene side

15 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 15 Trær •Et tre er et spesialtilfelle av en graf –kan ikke inneholde sykluser –må henge sammen –alltid eksakt én vei mellom to noder –én node defineres som rot –treet brer seg ut fra rota –en hvilken som helst node kan defineres som rot tre ikke et tre

16 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 16 Nodene i et tre rot blad foreldrenoder barnenoder

17 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 17 Binære søketrær •Et tre der hver forelder har maksimalt to barn kalles et binærtre. •Barna utgjør roten i høyre og venstre subtre. •Til hver node i treet hører det data. –det venstre barnet sine data er ”mindre eller lik” forelderens data –det høyre barnet sine data er ”større enn” forelderens data venstre subtre Vis programliste 17.7 side BinaertSoekeTre rot toString settInnVerdi søkEtterVerdi

18 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 18 Klassen SubTre SubTre høyreTre venstreTre forelder verdi toString settInnVerdi søkEtterVerdi Vis programliste 17.8 side Vis testprogrammet side 637

19 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 19 Binære søketrær i forhold til lenkede lister •Søking etter data er mye raskere i et søketre enn i en lenket liste. –Søketiden i en lenket liste er i verste fall proporsjonal med antall elementer (= n) i listen. –Å søke i et binært søketre betyr å gå ned gjennom treet til vi finner rette objekt, eller vi når bunnen. Mye kortere! –Treet er balansert dersom det er mest mulig symmetrisk og rett. –Søket er mest effektivt dersom treet er balansert. –Det er mulig å vise at verst tenkelige søketid i et balansert tre er proporsjonal med log(n). –log(n) er alltid mindre enn n •Å sette inn data tar lenger tid i et binært søketre enn i en liste. Gjør oppgaven side 637

20 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 20 Interface java.util.Map •En avbildning (engelsk: map) ivaretar en kobling mellom nøkler og data. –Alle nøklene er forskjellige. –Hver nøkkel er koblet til eksakt én verdi. –Avbildningen skal gjøre det raskt å hente ut data når nøkkelverdien er gitt. •Interface java.util.Map –Nøkler og data er objekter av vilkårlig type. –Dersom du forsøker å legge inn en nøkkelverdi som eksisterer fra før, vil nøkkelen knyttes til den nye dataverdien du legger inn. –Metoder: •public Datatype get(Object nøkkel) •public Datatype put(Nøkkeltype nøkkel, Datatype data) •public Datatype remove(Object nøkkel)

21 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 21 Klassen java.util.TreeMap •Klassen implementerer et binært søketre som holdes godt balansert •Klassen implementerer Map, og også SortedMap: –public Nøkkeltype firstKey() –public Nøkkeltype lastKey() •Nøklene må kunne sorteres –enten må en ”komparator” sendes inn som argument til konstruktøren, eksempel kollator fra side 348 (nøkkelen er av String type): TreeMap treEksempel = new TreeMap (java.text.Collator.getInstance()); –eller klassen som nøklene tilhører må implementere interfacet Comparable •Eksempel, treet side 632 (lysbilde 17) –Tallene blir nøkler til nodene. –Vi lar dataene være personnavn.

22 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 22 Vi prøver TreeMap class TreeMapTest { public static void main(String[] args) { TreeMap treEksempel = new TreeMap (); treEksempel.put(15, "Ole"); treEksempel.put(10, "Ingrid"); treEksempel.put(28, "Åse"); treEksempel.put(3, "Beate"); treEksempel.put(14, "Tove"); treEksempel.put(20, "Petter"); treEksempel.put(16, "Anders"); treEksempel.put(21, "Toril"); System.out.println("Innholdet i treet: " + treEksempel.toString()); String test = treEksempel.get(11); if (test == null ) System.out.println("11 finnes ikke"); else System.out.println("11 finnes: " + test); test = treEksempel.get(10); if (test == null ) System.out.println("10 finnes ikke"); else System.out.println("10 finnes: " + test); System.out.println("Laveste nøkkelverdi: " + treEksempel.firstKey()); System.out.println("Høyeste nøkkelverdi: " + treEksempel.lastKey()); } Kjøring: Innholdet i treet: {3=Beate, 10=Ingrid, 14=Tove, 15=Ole, 16=Anders, 20=Petter, 21=Toril, 28=Åse} 11 finnes ikke 10 finnes: Ingrid Laveste nøkkelverdi: 3 Høyeste nøkkelverdi: 28 Gjør oppgaven side 639

23 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 23 Hashtabeller •En hashtabell skiller seg fra –et binært søketre ved at elementene ikke har noen innbyrdes ordning –en lenket liste ved at søk går raskere •Brukes bl.a. i mange operativsystemer til å holde rede på filene i en katalog •Nøklene plasseres i bøtter •Bøttene –er som oftest ordnet –duplikater ikke tillatt •Søk og innsetting går raskt –beregn riktig bøtte –søk etter verdien i den relativt korte listen i bøtta, eller –sett inn verdien, for eksempel til slutt i listen •Lastfaktoren er lik forholdet mellom antall elementer og antall bøtter. –høy lastfaktor: lang søketid, god plassutnyttelse –lav lastfaktor: kort søketid, plasskrevende, mange bøtter med få elementer hashfunksjon nøkkelverdibøtteverdi

24 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 24 Eksempel på hastabell Hashfunksjon: Plukk ut siste siffer i nøkkelverdien. bøttenr. Hver nøkkelverdi kan f.eks svare til opplysninger om en person. Disse dataene er ikke vist på figuren.

25 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 25 Klassen java.util.HashMap •Rehashing foretas når lastfaktoren blir 0,75 –antall bøtter endres, og alle adresser beregnes på nytt •Hver klasse kan ha sin egen hashfunksjon, hvis ikke arves implementasjonen av hashCode() fra klassen Object •Klassen HashMap implementerer interfacet Map med kjente metoder: –public Datatype get(Object nøkkel) –public Datatype put(Nøkkeltype nøkkel, Datatype data) –public Datatype remove(Object nøkkel)

26 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 26 Klassen som beskriver nøkkelen vist på lysbilde 24 class Ident { private int verdi; public Ident(int startVerdi) { verdi = startVerdi; } public int hashCode() { // Plukker ut siste siffer i tallverdien return verdi % 10; } public String toString() { // nødvendig for at nøkkelen skal skrives ut riktig return "" + verdi; } public boolean equals(java.lang.Object obj) { // nødvendig for at søk skal bli riktig return ((Ident) obj).verdi == verdi; }

27 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 27 Klientprogram som lager og prøver hashtabellen class HashTest { public static void main(String[] args) { HashMap hashEksempel = new HashMap (10); hashEksempel.put(new Ident(2), "Ole"); hashEksempel.put(new Ident(11), "Ingrid"); hashEksempel.put(new Ident(16), "Åse"); hashEksempel.put(new Ident(18), "Beate"); hashEksempel.put(new Ident(31), "Tove"); hashEksempel.put(new Ident(35), "Petter"); hashEksempel.put(new Ident(55), "Anders"); hashEksempel.put(new Ident(85), "Toril"); hashEksempel.put(new Ident(94), "Tomas"); hashEksempel.put(new Ident(108), "Svein"); System.out.println("Innholdet i hashtabellen: " + hashEksempel.toString()); String test = hashEksempel.get(new Ident(11)); if (test == null ) System.out.println("11 finnes ikke"); else System.out.println("11 finnes: " + test); test = hashEksempel.get(new Ident(6)); if (test == null ) System.out.println("6 finnes ikke"); else System.out.println("6 finnes: " + test); } Utskrift: Verdi 2 gir kode 2 Verdi 11 gir kode 1 Verdi 16 gir kode 6 Verdi 18 gir kode 8 Verdi 31 gir kode 1 Verdi 35 gir kode 5 Verdi 55 gir kode 5 Verdi 85 gir kode 5 Verdi 94 gir kode 4 Verdi 108 gir kode 8 Innholdet i hashtabellen: {2=Ole, 94=Tomas, 108=Svein, 18=Beate, 16=Åse, 31=Tove, 11=Ingrid, 85=Toril, 55=Anders, 35=Petter} Verdi 11 gir kode 1 11 finnes: Ingrid Verdi 6 gir kode 6 6 finnes ikke

28 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 28 Iteratorer •En iterator hjelper oss å bla lineært gjennom en datastruktur •Eksempel ArrayList liste = new ArrayList (); liste.add("a"); liste.add("b"); liste.add("c"); /*Framgangsmåte 1 for å bla gjennom listen: */ Iterator i = liste.iterator(); while (i.hasNext()) { System.out.println(i.next()); } /*Framgangsmåte 2 for å bla gjennom listen: */ for (Iterator i2 = liste.iterator(); i2.hasNext();) { System.out.println(i2.next()); } •Enumeration er et eldre (fremdeles mye brukt) alternativ til Iterator –metodenavn: hasMoreElements() og nextElement()

29 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 29 Generiske typer, et eksempel til class MinKlasse { void enMetode(Type param) {... } MinKlasse mittObjekt = new MinKlasse (); mittObjekt.enMetode(new String("En test")); MinKlasse mittObjekt = new MinKlasse (); HashMap minHash = new HashMap(); mittObjekt.enMetode(minHash); MinKlasse mittObjekt = new MinKlasse (); HashMap minHash = new HashMap(); mittObjekt.enMetode(minHash); Ikke samsvar i type Typeparameteren til en metode hentes fra typeparameteren i klassen

30 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 30 Jokertegn i generiske typer class Summerer { public double summer(ArrayList liste) { double sum=0; for (Number n:liste) { sum += n.doubleValue(); } return sum; } public class SummereSamling { public static void main(String[] args) { ArrayList floatListe = new ArrayList (); ArrayList intListe = new ArrayList (); Summerer summerer = new Summerer(); floatListe.add(new Float(10.0)); floatListe.add(new Float(23.6)); floatListe.add(new Float(3)); intListe.add(new Integer(67)); intListe.add(new Integer(987)); intListe.add(new Integer(-1678)); // Summerer de to listene med det samme kallet til summer(): System.out.println("Summen av elementene i float-listen er: "+ summerer.summer(floatListe)); System.out.println("Summen av elementene i integer-listen er: "+ summerer.summer(intListe)); } Kan summere objekter som tilhører subklasser til Number Gjør oppgaven side 649

31 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 31 Enda mer generell type •Objektene må tilhøre klassen AnnenKlasse eller en subklasse til AnnenKlasse: –MinKlasse •Objektene må tilhøre klassen AnnenKlasse eller en superklasse til AnnenKlasse: –MinKlasse •Objektene kan tilhøre en hvilken som helst klasse –MinKlasse


Laste ned ppt "Programmering i Java versjon januar 2005 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else."

Liknende presentasjoner


Annonser fra Google