Forelæsning Uge 6 Mandag

Relaterede dokumenter
Forelæsning Uge 6 Mandag

Forelæsning Uge 6 Mandag

Forelæsning Uge 6 Mandag

Forelæsning Uge 4 Mandag

Forelæsning Uge 5 Mandag

Forelæsning Uge 4 Torsdag

Forelæsning Uge 4 Torsdag

Forelæsning Uge 5 Mandag

Forelæsning Uge 4 Mandag

Forelæsning Uge 5 Mandag

Forelæsning Uge 6 Mandag

Forelæsning Uge 4 Mandag

Forelæsning Uge 5 Mandag

Forelæsning Uge 3 Mandag

Forelæsning Uge 4 Torsdag

Ugeseddel 4 1. marts - 8. marts

Eksempel: Skat i år 2000

Forelæsning Uge 3 Mandag

Forelæsning Uge 3 Mandag

Forelæsning Uge 3 Mandag

Forelæsning Uge 2 Torsdag

Forelæsning Uge 2 Torsdag

Forelæsning Uge 12 Torsdag

Datalogi OB, Efterår 2002 OH er, forelæsning 10/ Klasser og nedarvning

Forelæsning Uge 3 Torsdag

Forelæsning Uge 2 Torsdag

dintprog Manual Revision: 1241 August 24, 2010 I Introduktion 3 1 Notation 3 II Begreber 4 2 Grundbegreber om programmering 4

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 4

DM507 Algoritmer og datastrukturer

Forelæsning Uge 12 Mandag

Opfølgning på Dygtig Skildpadde (Michael) To algoritmeskabeloner

DM507 Algoritmer og datastrukturer

Forelæsning Uge 3 Torsdag

Klasser og nedarvning

DANMARKS TEKNISKE UNIVERSITET

Forelæsning Uge 6 torsdag repetition

class Time { int hours, min; } } Time t1; // Erklær variabel af type Time class Time1 { public static void main(string[] args) { Time t1; t1.

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 3

Forelæsning Uge 2 Torsdag

Forelæsning Uge 1 Torsdag

COMPUTERSPIL 1. Opgave 1. Opgave 2

Forelæsning Uge 6 torsdag repetition

Forelæsning Uge 1 Torsdag

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007

dintprog Manual Revision: 731 September 30, Introduktion Notation... 3 I Begreber 4 2 Grundbegreber om programmering 4

Forelæsning Uge 2 Mandag

COMPUTERSPIL 1. Opgave 1

Sekvensafstand DM34 - Eksamensopgave. Jacob Aae Mikkelsen

DRONNINGER (QUEENS) Opgave 1

Programmering 1999 KVL Side 5-4. Klassen Time: metoder. Metoder i objektet giver mulighed for at ændre tilstanden, eller kigge på tilstanden.

Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version

Forelæsning Uge 9 Mandag

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java

Forelæsning Uge 2 Mandag

b) Udvid din implementation af forme til at understøtte.equals. To objekter af samme form er ens hvis de har samme værdier i felterne.

DM507 Algoritmer og datastrukturer

Skriftlig eksamen i Datalogi

Har kun én enkelt abstract metode De steder, hvor man skal bruge et objekt, hvis type er et funktionelt interface, kan man i stedet bruge en lambda

Tabelbegrebet. Klassediagrammer (III) Oversigt. Anvendelse af Tabeller. Tabeller og qualified associations

DM507 Algoritmer og datastrukturer

Integer.parseInt(args[0]) konverterer tegnstreng (f.eks. "10") til heltal (10). if (udtryk) else

Løsning af møntproblemet

Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen.

Forelæsning Uge 10 Torsdag

Abstrakte datatyper C#-version

BRP Kursusintroduktion og Java-oversigt

Software Construction 1 semester (SWC) Spørgsmål 1

Forelæsning Uge 2 Mandag

Skriftlig eksamen i Datalogi

Programmering og Problemløsning, 2017

Forelæsning Uge 3 Torsdag

Hvad er Objekter - Programmering

DM507 Algoritmer og datastrukturer

Klasser og objekter. (Afsnit i manualen)

Forelæsning Uge 11. Nedarvning. Object klassen. Projektopgave om computerspil

Python programmering. Per Tøfting. MacFest

DM01 DM Obl. Afl. Jacob Christiansen, , D12, Elias 18/ Side 1 af 11

Hashing og hashtabeller

//Udskriver System.out.println("Hej " + ditfornavn + " " + ditefternavn + "."); System.out.println("Du er " + dinalder + " aar gammel!

Forelæsning Uge 3 Torsdag

Introduktion til ActionScript

Forelæsning Uge 3 Torsdag

Sekvenser af længde mellem 1 og 4 ord repræsenteres ved en klasse Segment, som uden grundlæggende ser således ud:

Forelæsning Uge 9 Mandag

Skriftlig eksamen i Datalogi

Sproget Six. Til brug i rapportopgaven på kurset Oversættere. Vinter Abstract

DM507 Algoritmer og datastrukturer

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004

Software Construction 1. semester (SWC) januar 2014 Spørgsmål 1

DM507 Algoritmer og datastrukturer

Quiz Uge 5 mandag første time

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11

Programmering i C. Lektion september 2009

Kapitel 4 Løkker i C#

Forelæsning 17, tirsdag 2. november 1999 Søgning efter en given værdi i en tabel. Programmering 1999

Programmering for begyndere Lektion 2. Opsamling mm

Virkefeltsregler i Java

Målet for disse slides er at diskutere nogle metoder til at gemme og hente data effektivt.

Design by Contract Bertrand Meyer Design and Programming by Contract. Oversigt. Prædikater

Transkript:

Forelæsning Uge 6 Mandag Funktionel programmering i Java (Kapitel 5) Lambda'er (kodestumper, der kan bruges som parametre i et metodekald) Streams (sekvenser af data / strømme af data) Brug af assignments erstattes af evaluering af komplekse funktioner De fem algoritmeskabeloner implementeret ved hjælp af streams og lambda'er Sortering ved hjælp af lambda'er Forskellige typer objektsamlinger (Kapitel 6) List (lister) kendt fra ArrayList Set (mængder) Map (afbildninger) Polymorfe variabler Dokumentation af jeres egne klasser

Imperative og funktionelle sprog De dele af Java, som I har set indtil nu, er imperative En udførsel af et program forstås som en række operationer, der ændrer systems tilstand, f.eks. via assignments til feltvariabler Objekt-orienterede sprog (og de fleste andre programmeringssprog) er (primært) imperative Eksempler: Java, C#, C og C++ Funktionelle programmeringssprog fungerer anderledes En udførsel af et program forstås som en evaluering af et matematisk udtryk (uden brug af assignments) Kan være sværere at lære/bruge, men gør ofte programmer kortere, mere letlæselige og nemmere at bevise korrekte Eksempler: Standard ML, OCaml, F#, Lisp, Haskell og Erlang Moderne sprog er ofte både imperative og funktionelle Java indeholder lambda'er (som I skal lære om i denne forelæsning) OCaml indeholder mutable data (som kan ændres med assignments) 2

Lambda calculus Funktionelle programmeringssprog bygger på lambda calculus Formalisme til beskrivelse af beregninger (introduceret i 1930) Java public int addone(int n) { return n+1; Funktion (metode) der lægger 1 til parameteren Standard ML (funktionelt sprog) fun addone(n) = n+1; Man behøver ikke at angive typerne Dem deducerer compileren selv fn(n) => n+1; Lambda calculus Anonym funktion (uden navn) Kan bruges som parameter til en anden funktion int int n.n+1 Datalogistuderende vil lære meget mere om -calculus i senere kurser 3

Funktionelle aspekter i Java Java er (primært) et imperativt programmeringssprog Men de nyere versioner af Java (fra og med version 8 i 2014) indeholder også aspekter fra funktionelle programmeringssprog Det gør sproget mere kompliceret at lære (fordi der er flere ting) Til gengæld kan man (som I snart skal se) udtrykke visse ting simplere, mere elegant og mere læseligt De funktionelle dele af Java vinder hurtigt indpas og er dermed et "must" for alle kompetente Java programmører De er bl.a. yderst velegnede til processering (gennemsøgning) af collections (objektsamlinger) F.eks. skal vi om lidt se, at vi kan omskrive vores fem algoritmeskabeloner, så de bliver mere kompakte og letlæselige 4

Observationer af dyr (eksempel) public class Sighting { private final String animal; // Which animal private final int spotter; // Who saw it private final int count; // How many private final int area; // Where private final int period; // When public Sighting(String animal, int spotter, int count, int area, int period) { this.animal = animal; this.spotter = spotter;... public String tostring() { return animal + ", count = " + count + ", area = " + area + ", spotter = " + spotter + ", period = " + period;... Elephant, count = 24, area = 2, spotter = 3, period = 2 BlueJ bogen kalder metoden for getdetails Som vi skal se om et øjeblik, er det bedre at kalde den tostring 5

AnimalMonitor klassen import java.util.arraylist; public class AnimalMonitor { private ArrayList<Sighting> sightings; public AnimalMonitor() { this.sightings = new ArrayList<>(); // Add sightings from file public void addsightings(string filename) { SightingReader reader = new SightingReader(); sightings.addall( reader.getsightings(filename) ); public void printlist() { for(sighting s : sightings) { System.out.println( s );... Returnerer en ArrayList<Sighting> println metoden kalder automatisk tostring på s Elephant, count = 24, area = 2, spotter = 3, period = 2 6

Lambda'er i Java En lambda er en "kodestump", der implementerer en funktion Kan bruges i et metodekald (som værdi for en parameter) Den kaldte metode kan så udføre funktionen ("kodestumpen") Skellet mellem kode og data forsvinder Imperativ kode public void printlist() { for(sighting s : sightings) { System.out.println(s); For-each løkke Bruger kroppen på alle elementer Funktionel kode public void printlist() { sightings.foreach( s -> System.out.println(s)); foreach er en metode i ArrayList klassen (og andre collections) Tager en lambda som parameter Bruger lambda'en på alle elementerne Lambda 7

Java syntaks for Lambda'er Den generelle syntax er som følger (P p, Q q, ) -> { code; Simplifikationer Vi kan (som regel) udelade typerne på parametrene, idet compileren selv kan deducere dem Hvis kroppen kun har én sætning kan vi udelade { og semikolonnet Hvis der kun er én parameter (uden typeangivelse) kan vi udelade ( ) (p, q, ) -> code p -> code Eksemplet fra før sightings.foreach( s -> System.out.println(s)); Lambda 8

Streams i Java, Interfacet Stream<T> En stream er sekvens af data, f.eks. Elementerne i en collection (f.eks. en arrayliste) Data der "strømmer" ind via et netværk Tekstlinjer fra en tekstfil Tegn (char værdier) fra en tekststreng (String) Karakteristika for streams Elementer tilgås ikke via et index (men i rækkefølge) Streams er immutable (rækkefølgen og elementer kan ikke ændres), men man kan lave en ny stream ud fra den gamle Streams kan være potentielt uendelige Elementer i en stream kan behandles parallelt på en multicore maskine Potentiel stor effektivitetsgevinst uden ekstra programmeringsindsats En arrayliste er ikke en stream Men ArrayList klassen har en metode, som skaber en stream ud fra arraylistens elementer (analogt for andre collections) 9

Streams har tre vigtige metoder (funktioner) filter funktionen Gennemløber en stream og skaber en ny stream indeholdende de elementer fra den gamle, som opfylder en given betingelse Stream med observationer af en given dyreart map funktionen Gennemløber en stream og skaber en ny stream ved at bruge en lambda på hvert element i den gamle stream reduce funktion Gennemløber en stream og returnerer en enkelt værdi (f.eks. ved at lægge alle værdierne i stream'en sammen) Stream med antal dyr, der er observeret i de enkelte observationer Total antal observationer 10

Pipelines (sammensætning af funktioner) Stream funktioner kan sættes sammen til en pipeline Nedenstående pipeline beregner hvor mange elefanter der er observeret Java (pseudokode) sightings.filter(animal == elephant).map(count).reduce(sum); For at få eksekverbar Java kode mangler vi to ting Arraylisten sightings skal "omdannes" til en stream Parametrene til filter, map og reduce funktionerne skal formaliseres 11

Opbygning af pipelines Pipelines er opbygget af en source (kilde) et antal intermediate (mellemliggende) operationer en terminal (afsluttende) operation, som producerer en værdi (eller har resultattypen void) Hver intermediate operation producerer en ny stream Eksemplet fra før sightings er kilden filter og map er intermediate reduce er terminal Man kan nemt lave andre beregninger Hvad gør denne pipeline? sightings.filter(animal == Elephant).map(count).reduce(sum); sightings.filter(spotter == spotterid).filter(period == dayid).map(count).reduce(sum); 12

Filter funktionen Gennemløber en stream og skaber en ny indeholdende de elementer fra den gamle, som opfylder en given betingelse Intermediate operation Udvælgelsen sker via et prædikat (predicate), dvs. en lambda med returtype boolean Input stream ændres ikke (streams er immutable) Skaber en stream ud fra arraylisten (metode i ArrayList) Prædikat, der bruger equals metoden fra String klassen til at afgøre, om det var elefanter, der blev observeret sightings.stream().filter( s -> s.getanimal().equals("elephant")).map(count).reduce(sum); Sighting -> boolean Vi specificerer ikke typen for variablen s Compileren ved at sourcen leverer Sighting objekter 13

Map funktionen Gennemløber en stream og skaber en ny ved at bruge en lambda på hvert element i den gamle stream Intermediate operation Mapningen sker ved hjælp af en lambda Input stream ændres ikke (streams er immutable) sightings.stream().filter( s -> s.getanimal().equals("elephant")).map( s -> s.getcount() ).reduce(sum); Sighting -> int Vi specificerer ikke typen for variablen s Compileren ved at sourcen, og dermed filter metoden, leverer Sighting objekter 14

Reduce funktionen Gennemløber en stream og returnerer én værdi Terminal operation Metoden har to parametre Første parameter er en startværdi Anden parameter er en lambda med to parametre Input stream ændres ikke (streams er immutable) sightings.stream().filter( s -> s.getanimal().equals("elephant")).map( s -> s.getcount() ).reduce( 0, (result, elem) -> result + elem ); Startværdi Lambda: int * int -> int Java (pseudokode) for reduce funktionen I vores eksempel summeres elementerne result = startværdi; for(hvert element elem i stream) { result = lambda(result, elem); return result; 15

Færdig metode (med streams og lambda'er) /** * Return the number of sightings of the specified animal. * @param animal Type of animal. * @return Count of sightings of the given animal. */ public int getcount(string animal) { return sightings.stream().filter( s -> s.getanimal().equals(animal)).map( s -> s.getcount() ).reduce( 0, (result, elem) -> result + elem ); Vores pipeline (med parameteren animal indsat i stedet for konstanten "Elephant") 16

Andre Stream metoder Stream klassen har ca. 40 forskellige metoder, hvoraf vi i det følgende vil bruge nedenstående count returnerer antallet af elementer i en Stream findfirst returnerer første element i en stream af typen Stream<T> som et objekt af typen Optional<T> Indeholder et objekt af type T ispresent() returnerer true get returnerer elementet To muligheder.maptoint( s -> s.getcount() ).sum(); Alternativ til at bruge null til at angive, at man ikke har et objekt Er tomt ispresent() returnerer false Kald af get giver runtime fejl maptoint producerer en IntStream ud fra en Stream (ved hjælp af en brugerspecificeret lambda) sum returnerer summen af elementerne i en IntStream i stedet for at bruge reduce direkte.map( s -> s.getcount() ).reduce( 0, (result, elem) -> result + elem ); 17

Algoritmeskabelonerne, findone + findall Vores fem algoritmeskabeloner kan implementeres via streams og lambda'er public Optional<TYPE> findone( PARAM ) { return LISTE.stream().filter( elem -> TEST(elem, PARAM)).findFirst(); Lav en stream ud fra Arraylisten Returner det første af disse (som en Optional) Find de elementer, der opfylder TEST public List<TYPE> findall( PARAM ) { return LISTE.stream().filter( elem -> TEST(elem, PARAM)).collect(Collectors.toList()); collect er en metode i Stream klassen tolist er en klassemetode i Collectors klassen Returner de fundne elementer som en objektsamling af typen List List er et interface som ArrayList, og andre lister, implementerer) List og Collectors introduceres i afsnit 6.17 18

findnoof og findsumof public long findnoof( PARAM ) { return LISTE.stream().filter( elem -> TEST(elem, PARAM)).count(); Lav en stream ud fra Arraylisten Tæl hvor mange der er (returnerer en long) Find de elementer, der opfylder TEST public int findsumof( PARAM ) { return LISTE.stream().filter( elem -> TEST(elem, PARAM)).mapToInt( elem -> VALUE(elem, PARAM)).sum(); Læg elementerne sammen (returnerer en int) Lav en IntStream 19

findbest Find de elementer der opfylder TEST public Optional<TYPE> findbest( PARAM ) { return LISTE.stream().filter( elem -> TEST(elem, PARAM)).max(new BEST()); Lav en stream ud fra Arraylisten Returner bedste element (som en Optional) Ordningen bestemmes ved hjælp af en klasse BEST, der implementerer Comparator interfacet Comparator har en klassemetode comparing Tager en lambda som parameter og returnerer en Comparator klasse Lambda'en specificerer, hvilken feltvariabel, der skal sorteres efter public Optional<Dog> youngestofbreed(string breed){ return dogs.stream().filter(d -> d.getbreed().equals(breed)).min( Comparator.comparing (d -> d.getage()) ); For at bruge de funktionelle algoritmeskabeloner, skal man importere: Collections, Comparator, og Optional via import java.util.*; (som også importerer ArrayList) Collectors via import java.util.stream.collectors; Klassemetode Lambda'en "udpeger" den feltvariabel, hvis værdier skal sammenlignes (ved hjælp af den naturlige ordning) 20

Sammenligning af algoritmeskabelonerne De funktionelle er mere kompakte og letlæselige end de imperative Alle funktionelle algoritmeskabeloner starter på samme måde public returtype find XXX( PARAM ) { return LISTE.stream().filter( elem -> TEST(elem, PARAM)).??? De to første linjer i kroppen er ens Kun sidste linje er forskellig findone.findfirst(); Optional<TYPE> findall findnoof.collect(collectors.tolist());.count(); long List<TYPE> findsumof findbest.maptoint( elem -> VALUE(elem, PARAM)).sum(); int.max( Comparator.comparing(d -> d.getfield())); Ved køreprøven skal de to sidste opgaver (11-12) løses ved hjælp af funktionel programmering, dvs. Streams, lambda'er og de funktionelle algoritmeskabeloner Optional<TYPE> 21

Sortering Indtil nu har vi sorteret ved at skrive en compareto metode For Phone opgavesættet ser dette ud, som vist nedenfor Vi sorterer efter pris, og hvis prisen er den samme efter brand public int compareto(phone other){ if(price!= other.getprice()) { return price other.price; return brand.compareto(other.getbrand()); Fastlæggelse af ordning via compareto metode public void printwebshop(){ System.out.println(name); Collections.sort(phones); for(phone p : phones { System.out.println(p); Udskrift af webshoppens navn Sortering Udskrift af den sorterede arrayliste 22

Funktionel sortering Som vi har set, har Comparator interfacet en klassemetode, der gør det let at definere ordninger uden selv at skrive en compare metode For Persons kan dette anvendes, som vist nedenfor Vi vil sortere efter navn, og hvis navnet er det samme efter alder public void printpersons() { Collections.sort(persons, Comparator.comparing(p -> p.getage())); Collections.sort(persons, Comparator.comparing(p -> p.getname())); persons.foreach(p -> System.out.println(p)); Udskrift af den sorterede arrayliste Sortering via to Comparator klasser (der anvender den naturlige ordning) Bemærk, at vi starter med det mindst betydende kriterie og slutter med det mest betydende Hvis man vil have de ældste først sætter man et minus på lambda'ens højre side 23

Funktionel sortering version 2 Man kan nøjes med en enkelt sortering Nu bruger vi én Comparator klasse, der først sorterer efter navn og dernæst efter alder Før brugte vi to forskellige Comparator klasser, hvor den ene sorterede efter navn og den anden efter alder Nu er det nødvendigt at hjælpe compileren ved at angive p's type public void printpersons() { Collections.sort(persons, Comparator.comparing(( Person p) -> p.getname()).thencomparing (p -> p.getage())); persons.foreach(p -> System.out.println(p)); Metode i Comparator interfacet Nu starter vi med det mindst betydende kriterie og slutter med det mest betydende (hvilket gør koden lettere at forstå) 24

Funktionel sortering version 3 I stedet for at sortere arraylisten kan vi sortere en stream public void printpersons() { persons.stream().sorted(comparator.comparing((person p) -> p.getname()).thencomparing( p -> p.getage())).foreach(p -> System.out.println(p)); public void printperons() { persons.stream().sorted(comparator.comparing( Person::getName ) Metode i Stream klassen (fungerer analogt til sort metoden i ArrayList klassen) Bemærk at arraylisten ikke ændres. Det er kun stream'en vi sorterer Derudover kan vi erstatte de tre lambda'er med metode referencer Forkortelse for lambda'en (Person p) -> p.getname().thencomparing ( Person::getAge )).foreach( System.out::println ); Metode referencer er beskrevet på side 219-220 i BlueJ bogen De kan også bruges i findbest algoritmeskabelonen Forkortelse for lambda'en p -> System.out.println(p) reversed() returnerer en comparotor med omvendt sortering Forkortelse for lambda'en (Person p) -> p.getage() 25

Map (afbildning) Afbildning fra en type ind i en anden Der er mange forskellige maps på samme måder som der er forskellige lister Her vil vi se på HashMap<K,V> klassen Parametriseret klasse K angiver keys (nøgler) den type der afbildes fra V angiver values (værdier) den type der afbildes til Et Map objekt indeholder par på formen (k,v), hvor k er af typen K og v af typen V Hvis man kender nøglen k kan man slå værdien v op (ved hjælp af Map objektet) En værdi v kan være knyttet til flere nøgler (afbildningen behøver ikke være injektiv) Omvendt har en nøgle højst én tilknyttet værdi (ellers ville det være en relation og ikke en afbildning) 26

Telefonliste En telefonliste er et typisk eksempel på brug af Map K er personer, mens V er deres telefonnumre Begge repræsenteres som tekststrenge (String) contacts : HashMap<String, String> "Peter Andersen" "2674 5681" "Ida Thomasen" "4525 2512" "Ole Rasmussen" "hemmeligt" Alternativt kan man bruge HashMap<String, Integer> Nu er værdierne heltal (og man må finde en anden måde at angive, at et nummer er hemmeligt) 27

Implementation af telefonliste // Oprettelse af kontaktliste HashMap<String, String> contacts = new HashMap<>(); // Operettelse af kontakter contacts.put("peter Andersen", "2674 5681"); contacts.put("ida Thomasen", "4525 2512"; contacts.put("ole Rasmussen", "hemmeligt"); // Opslag i kontaktlisten String number = contacts.get("ida Thomasen"); System.out.println(number); "4525 2512" get metoden laver opslag Returnerer den værdi, der er knyttet til den anvendte nøgle (null hvis nøglen ikke er i brug) put metoden indsætter nye par Hvis nøglen allerede er i brug glemmes det gamle par Andre metoder i HashMap size metoden fortæller, hvor mange par, der er i afbildningen keyset metoden returnerer en mængde indeholdende alle de nøgler (keys), der er i brug I alt er der ca. 20 metoder. Studér disse i Java API'en 28

Set (mængde) Matematisk mængde Et element kan højst forekomme én gang i mængden Indsætter man elementet en gang til, har det ingen effekt Der er mange forskellige mængder på samme måde, som der er forskellige lister og maps Her vil vi se på HashSet<E> klassen En mængde af personnavne kan modelleres via HashSet<String> persons : HashSet<String> "Peter Andersen" "Ida Thomasen" "Ole Rasmussen" 29

Implementation af mængde af personer // Oprettelse af mængde HashSet<String> persons = new HashSet<>(); // Indsættelse af personnavne persons.add("peter Andersen"); persons.add("ida Thomasen"); persons.add("ole Rasmussen"); System.out.println(persons.size()); add metoden indsætter elementer 3 returnerer true, hvis mængden ændres size metoden fortæller, hvor mange elementer der er i mængden // Indsæt et navn, der allerede er i mængden persons.add("ida Thomasen"); System.out.println(persons.size()); 3 add metoden returnerer false, hvis mængden ikke ændres Det er equals metoden (for element typen E), der bruges til at afgøre, om elementet allerede forekommer i mængden Object klassen (som alle klasser er underklasser af) har en equals metode Dette sikrer at alle klasser har en equals metode 30

Eksempel: Indlæsning af kommandoer Returnerer en mængde af tekststrenge Metodens navn Prompt bruger for input Array (Kap. 7) Ligner arraylister, men har et fast (på forhånd kendt) antal elementer Lokal variabel (initaliseres til at være den tomme mængde) Returner den konstruerede mængde public HashSet<String> getinput() { System.out.print("> "); String inputline = reader.nextline().trim().tolowercase(); Fjern blanke fra enderne og konverter til små bogstaver String[] wordarray = inputline.split(" "); HashSet<String> words = new HashSet<>(); for( String word : wordarray ) { words.add(word); return words; Næste linje fra reader Metode i String klassen Opdeler strengen de steder, hvor der er blanke tegn (parameteren) Returnerer "stumperne" i et array " Peter besøgte Hans peter " "peter besøgte hans peter" for-each løkke, hvor arrayets elementer et for et kopieres over i mængden "peter" "besøgte" "" "" "hans" "peter" "peter" "besøgte" "" "hans" 31

Collections (objektsamlinger) Forskellige måder at gruppere objekter ArrayList, LinkedList, (lister) HashMap, TreeMap, LinkedHashMap, (maps) HashSet, TreeSet, LinkedHashSet, (mængder) Sidste del af navnet angiver om det er en liste, map eller mængde (set) Første del af navnet angiver implementationsmetoden Alle collections er parametriserede typer Parametrene skal være objekt typer For de primitive typer bruges de tilsvarende wrapper typer Alle collections har de samme navne på metoder F.eks. size, clear og isempty Bemærk dog, at man i lister og mængder indsætter via add metoden, mens man i maps indsætter via put metoden 32

Polymorfe variabler Når vi skriver et program, behøver vi ikke fra start at fastlægge, hvilken type objektsamling vi vil anvende I stedet for at erklære en variabel til at referere til en arrayliste ArrayList<Person> persons; kan man med stor fordel nøjes med at angive at den refererer til en liste List<Person> persons; Man kan så senere let udskifte en type liste med en anden Det eneste sted man skal ændre i koden er der, hvor listen oprettes. Her angiver man hvilken type liste, man vil bruge persons = new ArrayList<>(); persons = new LinkedList<>(); Variablen persons er polymorf, fordi den kan pege på værdier af forskellig type Tilsvarende kan vi definere polymorfe variabler for mængder og maps Set<Person> persons; Map<Person,Person> farthers; List, Set og Map er interfaces (som vi skal kigge nærmere på i Kap. 12) 33

Dokumentation Når I (fremover) konstruerer en klasse skal den dokumenteres lige så godt som klasserne i Javas API Ellers får I genaflevering For klassen skal I angive En kommentar der beskriver klassens overordnede formål og virkemåde (se eksempler i Javas API) Et versions nummer (som bør indeholde datoen) Forfatterens navn(e) @version 2017-12-24 For hver konstruktør/metode skal I angive En kommentar der beskriver virkemåden Beskrivelse af de enkelte parametre Beskrivelse af den returnerede værdi /** * Comment */ @author Kurt Jensen /** * Comment */ @param animal Type of animal. Første sætning bruges i "Summary"-delen @return List of all sightings. Hele kommentaren bruges i "Details"-delen Skift fra Source code til Documentation view (i BlueJ editoren) for at kontrollere, at jeres dokumentation ser fornuftig ud 34

Opsummering Funktionel programmering i Java (Kapitel 5) Forskellen på imperative og funktionelle programmeringssprog Lambda'er (kodestumper, der kan bruges som parametre i et metodekald) Streams (sekvenser af data / strømme af data) De fem algoritmeskabeloner implementeret ved hjælp af streams og lambda'er Køreprøven Sortering ved hjælp af lambda'er Forskellige typer objektsamlinger (Kapitel 6) Lister (kendt fra ArrayList) Sæt (mængder) Maps (afbildninger) Polymorfe variabler Dokumentation af jeres egne klasser Opgave 1-10 skal løses ved hjælp imperativ programmering, man må altså ikke bruge streams og lambda'er Opgave 11-12 skal løses ved hjælp af funktionel programmering, dvs. streams, lambda'er og de funktionelle algoritmeskabeloner) 35

Resten af kapitel 6 i BlueJ bogen Kapitel 6 er forholdsvis langt, men det indeholder mange ting, som I allerede er stødt på her i kurset, og derfor vil have let ved at læse Læsning og skrivning af Java dokumentation Brug af klassen Random til at generere tilfældige tal Import af klasser og pakker fra Javas klassebibliotek Automatisk konvertering af værdier mellem primitive typer og de tilhørende wrapper klasser Brug af nøgleordene public og private Klassevariabler og klassemetoder (static) Konstanter (final) Læs kapitlet grundigt uden at springe afsnit over Det er nyttig repetition og tilføjer nye detaljer 36

Uge 6 Forelæsning Dagens forelæsning er den sidste før efterårsferien Husk at se videoerne om køreprøveopgaverne Uge 5: Videoer om opgavesættene Phone og Pirate Uge 6: Videoer om opgavesættene Car og Turtle Opgaver Uge 6: Dog, Boat (imperativ programmering) Biker og Film (funktionel programmering) Uge 7: Ingen afleveringsopgaver Vi har desværre pt ikke videoer for de funktionelle algoritmeskabeloner Anbefalet rækkefølge (i uge 6) Se videoerne om Car Prøv selv at løse opgaverne i Car Se videoerne om Turtle Prøv selv at løse opgaverne i Turtle Løs Dog, Boat Løs Biker og Film (ved hjælp af funktionel programmering) Brug testprogrammerne (findes under "Opgaver") 37

Uge 7 Løs tidligere opgavesæt Et stort udvalg (ca. 50 stk) kan findes nederst på Uge 1-7 websiden Tag tid, så du kan se, hvor lang tid du er om at løse et opgavesæt Det er ikke unormalt, at det i begyndelsen tager ca. 1 time at løse et opgavesæt men øvelse gør mester Husk at bruge Test af køreprøveopgaver Deltag i prøvekøreprøve ved den første øvelsesgang i uge 7 Læs materiale Læs BlueJ bogen, slides og anden dokumentation efter behov, mens I øver jer på opgavesættene Held og lykke ved køreprøven 38

Det var alt for nu.. spørgsmål 39