Forelsning Uge 5 Mandag Algoritmeskabeloner find One find
Forelæsning Uge 5 – Mandag • Algoritmeskabeloner • find. One, find. All, find. No. Of, find. Sum. Of • find. Best (sidste mandag) • Brug af klassen Collections og interfacet Comparable • Blue. J’s Debugger • Nyttig til at inspicere kørende Java kode • Resten af d. Int. Prog kurset
● Algoritmeskabeloner Lidt repetition fra i mandags Finder ét element med den angivne egenskab public TYPE find. One( PARAM ) { for ( TYPE elem : LISTE ) { if ( TEST(elem, PARAM) ) { return elem; } } return null; } Alle eksamenssæt indeholder opgaver, som kan løses ved hjælp af algoritmeskabeloner Finder alle elementer med den angivne egenskab, og returnerer dem i en arrayliste public Array. List<TYPE> find. All( PARAM ) { Array. List<TYPE> result = new Array. List<TYPE>(); for ( TYPE elem : LISTE ) { if ( TEST(elem, PARAM) ) { result. add(elem); } } return result; } 2
Algoritmeskabeloner Finder antallet af elementer med den angivne egenskab public int find. No. Of( PARAM ) { int result = 0; for ( TYPE elem : LISTE ) { if ( TEST(elem, PARAM) ) { result++; } } return result; } Finder summen af de elementer, der har den angivne egenskab public int find. Sum. Of( PARAM int result = 0; for ( TYPE elem : LISTE ) if ( TEST(elem, PARAM) ) result += VALUE(elem, } } return result; } ) { { { PARAM); 3
find. Best = finder bedste element i liste public TYPE find. Best( PARAM ) { TYPE result = null; Holder hidtil bedste for ( TYPE elem : LISTE ) { if ( TEST(elem, PARAM) ) { if ( result == null } } } result = elem; } return result; || Er elem bedre end hidtil bedste? BEST(elem, result, PARAM) ) { or-operator (lazy) Har vi et hidtil bedste? Dette test udføres kun, hvis result != null Hvorfor er det vigtigt? • Algoritmeskabelon – Gennemsøger LISTE og returnerer det BEDSTE af de elementer, der opfylder TEST – Hvis flere elementer er lige gode, returneres et vilkårligt af disse – Hvis der ingen er, returneres null – Hvis man undlader TEST (og fjerner den yderste if-sætning), finder man det BEDSTE blandt alle i LISTE Gentag! 4
Eksempler på find. Best public Pixel find. Brightest. Dark. Pixel(int color) { Pixel result = null; for ( Pixel p : pixels ) { if ( p. get. Color() <= color ) { if ( result == null || p. get. Color() > result. get. Color() ) { } } } result = p; } return result; Finder den lyseste mørke pixel public Person find. First. Containing(String q) { Person result = null; for ( Person p : persons ) { if ( p. get. Name(). contains(q) ) { sammenligner to textstrenge if ( result == null || p. get. Name(). compare. To(result. get. Name()) < 0 ){ } } result = p; } } return result; Finder alfabetisk-første person, hvis navn indeholder den angivne textstreng 5
Sammenligning af algoritmeskabeloner • Fælles – Alle skabeloner gennemsøger en arrayliste og tjekker hvert enkelt element i listen op mod en angiven betingelse (der kan afhænge af parametre) – Betingelsen involverer kun det element i listen, der pt. undersøges • Forskelle – find. One returnerer ét element, der opfylder den angivne betingelse (og stopper så snart en sådant element er fundet) – find. All returnerer en arrayliste med alle elementer, der opfylder den angivne betingelse – find. No. Of returnerer antallet af elementer, der opfylder den angivne betingelse – find. Sum. Of returnerer summen af værdierne af de elementer, der opfylder den angivne betingelse Skabelon Initialisering Opdatering – find. Best returnerer det bedste find. All tom liste add af de elementer, der opfylder find. No. Of 0 += 1 den angivne betingelse Clicker Quiz find. Sum. Of 0 += VALUE find. Best null hidtil bedste 6
● Forprogrammerede metoder i Java Library • Klassen Collections indeholder en række nyttige metoder – Metoderne kan bruges på forskellige typer objektsamlinger – Typen skal implementere Collection interfacet – Det er f. eks. tilfældet for Array. List T min(Collection<T> c) T max(Collection<T> c) //returnerer mindste element //returnerer største element void sort(List<T> l) //sorterer listen void shuffle(List<T> l) //blander listen void reverse(List<T> l) //vender listen om boolean disjoint(Collection<T> c 1, Collection<T> c 2) int frequency(Collection<T> c, Object o). . . Alle metoderne er static Collections. metode() 7
Brug af Collections på Array. List<String> public class Driver { public static void run() { Array. List<String> list; list = new Array. List<String>(); list. add("Cecilie"); list. add("Erik"); list. add("Adam"); list. add("Bo"); list. add("Dora"); print("**********"); print("liste: " + list); print("min: " + Collections. min(list)); print("max: " + Collections. max(list)); Collections. sort(list); print("sorteret liste: " + list); } private static void print(Object o) { System. out. println(o); } } 8
Brug af Collections på Array. List<String> public class Driver { public static void run() { Array. List<String> list; . . . print("**********"); print("liste: " + list); print("min: " + Collections. min(list)); print("max: " + Collections. max(list)); Collections. sort(list); print("sorteret liste: " + list); Collections. shuffle(list); print("blandet liste: " + list); Collections. reverse(list); print("liste bagfra: " + list); }. . . } 9
Brug af Collections på Array. List<Person> public class Driver { public static void run() { Array. List<Person> list; list = new Array. List<Person>(); list. add(new Person("Cecilie", 18)); list. add(new Person("Erik", 16)); list. add(new Person("Adam", 16)); list. add(new Person("Bo", 39)); list. add(new Person("Dora", 47)); print("**********"); print("liste: " + list); Collections. shuffle(list); print("blandet liste: " + list); Collections. reverse(list); print("liste bagfra: " + list); }. . . } 10
Brug af Collections på Array. List<Person> public class Driver { public static void run() { Array. List<Person> list; list = new Array. List<Person>(); list. add(new Person("Cecilie", 18)); list. add(new Person("Erik", 16)); list. add(new Person("Adam", 16)); list. add(new Person("Bo", 39)); list. add(new Person("Dora", 47)); print("**********"); print("liste: " + list); print("min: " + Collections. min(list)); print("max: " + Collections. max(list)); Collections. sort(list); print("sorteret liste: " + list); }. . . } 11
Hvad gik galt? • Metoderne min, max og sort i klassen Collections kan kun anvendes, hvis elementerne i Array. Listen har en ordning – String klassen har en indbygget ordning (alfabetisk sortering) – Derfor kunne vi bruge min, max og sort på Array. List<String> • Person klassen (som vi selv har lavet) har (endnu ikke) en ordning – Derfor kan vi ikke bruge min, max og sort på Array. List<Person> – Men vi kan godt bruge shuffle og reverse, idet disse metoder ikke kræver en ordning e s u a P 12
Ordning kan defineres via interfacet Comparable public interface Comparable<T> { /** * @returns whether this object is * smaller (negative integer) * equal (0) * or greater (positive integer) * than object o */ public int compare. To(T o); } Tænk på et interface som en rolle – Person-objekter kan spille rollen Comparable, hvis to ting er opfyldt Person skal implementere interfacet implements Comparable<Person> { public class Person {. . . } public int compare. To(Person p) {. . . T = Person }. . . Person skal implementere en compare. To metode med den signatur, der er specificeret i interfacet T = Person Den ordning, som compare. To definerer, kaldes den NATURLIGE ORDNING 13
compare. To kan implementeres på mange måder • Vi kan sortere (alfabetisk) efter personens navn – Til dette formål kan vi bruge compare. To metoden fra String klassen public int compare. To(Person p){ return name. compare. To ( p. name ); } Personens eget navn Navnet på Metode fra personen p String klassen (sorterer alfabetisk) 14
Vi kan sortere efter personens alder public int compare. To(Person p){ • De yngste først if (this. age == p. age) { return 0; } if (this. age < p. age) { return -1; } else { Simplere løsning return +1; } p){ public int compare. To(Person } return this. age - p. age; } Hvis to personer har samme alder, er rækkefølgen vilkårlig 15
Vi kan kombinere de to sorteringskriterier – De yngste først – Hvis to personer er lige gamle: alfabetisk efter navn public int compare. To(Person p){ if ( this. age != p. age ) { return this. age - p. age; } //alderen er identisk return name. compare. To(p. name); Er alderen forskellig? Yngste først Alfabetisk efter navn } Alle eksamenssæt indeholder opgaver, som kan løses ved hjælp af Collections og Comparable 16
Klassediagram Collections T min(Collection<T> c) T max(Collection<T> c) void sort(List<T> l) void reverse(List<T> l) void shuffle(List<T> l). . . uses <<interface>> Collection boolean add(E e) boolean contains(Object o). . . uses <<interface>> Comparable Nyttige metoder (programmeret en gang for alle) int compare. To(T o) Diagrammet er ikke eksamenspensum extends implements <<interface>> List Set implements Array. List … <<interface>> Queue implements Hash. Set Pixel Person implements … String NYT : compare. To metode Resten er genbrug fra Java's API Linked. List Ca. 35 forskellige Collection klasser 17
Multiple sorteringsmåder • Hvad gør man, hvis vi har behov for at kunne sortere på flere forskellige måder, f. eks – Sommetider sortere personer efter navn – Sommetider sortere personer efter alder og navn • Så bruger man Collections sammen med Comparator interfacet (i stedet for Comparable interfacet) – Det skal vi se på næste mandag r e k c i Cl Quiz 18
● Blue. J's debugger (afluser = fejlfinder) Nyttig, når man skal tjekke den detaljerede opførsel af kørende Java kode Breakpoints indsættes (og fjernes) ved at klikke i venstre margin af editoren Under programudførelsen vil debuggeren stoppe, når et breakpoint nås, og vise positionen med en sort pil (samt gul farve) Herefter kan man ”steppe” gennem koden statement efter statement 19
Metodekald Når den næste sætning er et metodekald, har man to muligheder: Udfører hele metodekaldet uden at man ser detaljerne Starter metode-kaldet, men stopper ved første instruktion i den kaldte metode 20
Metodekald Parat til at udføre første statement i den kaldte metode Andre knapper: Fortsætter kørslen frem til næste breakpoint Stopper kørslen Nødstop (uendelig while-løkke eller lignende) 21
Undervejs kan man inspicere Igangværende metodekald Værdier for feltvariabler Værdier for lokale variabler 22
● Opsummering • Algoritmeskabeloner • find. One, find. All, find. No. Of, find. Sum. Of • find. Best Alle eksamenssæt indeholder opgaver, som kan løses ved hjælp af algoritmeskabeloner • Brug af klassen Collections og interfacet Comparable – Metoden compare. To definerer den naturlige ordning • Blue. J’s Debugger – Nyttigt værktøj til at finde fejl i kode Alle eksamenssæt indeholder opgaver, som kan løses ved hjælp af Collections og Comparable 23
Resten af d. Int. Prog kurset • Uge 5 – Torsdag: Ingen forelæsning • Uge 6 – Mandag • Nedarvning, abstrakte klasser og interfaces • Comparator ("generalisering" af Comparable – sortere på flere måder) – Torsdag • Repetition af det stof uge 2 -5 (intet nyt – genbrug af slides) • Uge 7 – Mandag: Ingen forelæsning – Torsdag • Eksamen • Kursusevaluering ved hjælp af clickere • Præmiering af de bedste projekter fra uge 5 • Mandelbrotmængden (eksempel på computer genererede billeder – uden for pensum, men enormt smukke) 24
Opgaver i uge 6 -7 • Uge 6 – 2 eksamensopgaver (fra 2013 -2014) • Uge 7 – 4 eksamensopgaver (fra 2013 -2014) • Alle eksamensopgaver løses og afleveres individuelt – Undervejs må I gerne snakke med jeres makker hjælpe hinanden – Når I begge har løst en opgave, gennemgår I hinandens løsninger og diskuterer, hvordan de kan forbedres – Derefter forbedrer I jeres egen løsning – Hver uge afleveres to af eksamensopgaverne individuelt til instruktoren – Husk at kurset har nul-tolerance overfor plagiering 25
Det var alt for nu…. . … spørgsmål 26
- Slides: 26