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



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

Klasser og objekter. (Afsnit i manualen)

Forelæsning Uge 1 Torsdag

Forelæsning Uge 1 Torsdag

Abstrakte datatyper C#-version

Forelæsning Uge 5 Mandag

Skriftlig eksamen i Datalogi

Forelæsning Uge 3 Mandag

Forelæsning Uge 3 Mandag

Forelæsning Uge 4 Torsdag

Forelæsning Uge 2 Mandag

Forelæsning Uge 3 Mandag

Forelæsning Uge 4 Torsdag

Forelæsning Uge 6 Mandag

Forelæsning Uge 3 Mandag

Forelæsning Uge 2 Mandag

Forelæsning Uge 2 Mandag

Forelæsning Uge 2 Torsdag

Eksempel: Skat i år 2000

Forelæsning Uge 5 Mandag

Forelæsning Uge 2 Mandag

Forelæsning Uge 5 Mandag

Forelæsning Uge 2 Mandag

DANMARKS TEKNISKE UNIVERSITET

Forelæsning Uge 5 Mandag

Forelæsning Uge 3 Torsdag

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

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

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

Forelæsning Uge 3 Torsdag

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

DM507 Algoritmer og datastrukturer

DATALOGI 1E. Skriftlig eksamen torsdag den 3. juni 2004

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer

SWC Elementer i klassedefinition

Forelæsning Uge 4 Mandag

Forelæsning Uge 4 Torsdag

DM507 Algoritmer og datastrukturer

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

Ugeseddel 4 1. marts - 8. marts

Klasser. Grundlæggende Programmering med Projekt. Peter Sestoft Tirsdag 2. september (Tak til Jakob Bardram for nogle slides) Dagens begreber

DM507 Algoritmer og datastrukturer

Kursus navn: Indledende programmering Kursus nr

Civilingeniøreksamen januar Skriftelig prøve den 12. januar 2001 Kursusnummer 49104

Forelæsning Uge 4 Mandag

Virkefeltsregler i Java

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

SWC eksamens-spørgsmål. Oversigt

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

Fundamentale sprogbegreber

Videregående programmering i Java

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

Dokumentation af programmering i Python 2.75

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

Forelæsning Uge 12 Torsdag

Forelæsning Uge 4 Mandag

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

Forelæsning Uge 12 Mandag

JavaScript. nedarvning.

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

Skriftlig eksamen i Datalogi

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

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

Forelæsning Uge 2 Torsdag

Hvad er Objekter - Programmering

Klasser og Objekter i Python. Uge 46 Learning Python: kap 15-16,

Forelæsning Uge 2 Torsdag

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

Specifikation Abstrakt OO OS-API Rev Specifikation. Abstrakt, objektorienteret operativsystem-api

Videregående Programmering for Diplom-E Noter

Skriftlig eksamen i Datalogi

Sekvensafstand DM34 - Eksamensopgave. Jacob Aae Mikkelsen

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.

Forelæsning Uge 2 Torsdag

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

BRP Kursusintroduktion og Java-oversigt

Forelæsning Uge 3 Torsdag

Jacob Christiansen, Institut for MAtematik og DAtalogi, Syddansk Universitet, Odense

Klasser og nedarvning

DM507 Algoritmer og datastrukturer

Polymorfi. Arv (inheritance) Abstrakte klasser, substitutionsprincippet, overriding, statisk og dynamisk type. Coercion

Java Programmering. En bog for begyndere. Skrevet af Henrik Kressner

Assignment #5 Toolbox Contract

Forelæsning Uge 6 Mandag

Forelæsning Uge 3 Torsdag

Forelæsning Uge 6 torsdag repetition

Studiepraktik. Thomas Bøgholm Mikkel Hansen Jacob Elefsen

Forelæsning Uge 6 Mandag

Webserverprogrammering

Introduktion til ActionScript, fortsat

Om binære søgetræer i Java

Forelæsning Uge 6 Mandag

Objektorientering. Programkvalitet

IFC Egenskaber. Mohammad Hussain Parsianfar s BYG DTU

Et generelt algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer. Ideen er simpel:

Modern Concurrency Abstractions for C#

Tree klassen fra sidste forelæsning

Programmering for begyndere Lektion 2. Opsamling mm

Forelæsning Uge 6 Mandag

Transkript:

dintprog Manual Revision: 1241 August 24, 2010 Indhold I Introduktion 3 1 Notation 3 II Begreber 4 2 Grundbegreber om programmering 4 3 Grundbegreber om modellering 4 III Sprogkonstruktioner 5 4 Klasser (Classes) 5 4.1 Type................................... 5 4.2 Feltvariabel (Fieldvariable, Attribut, Attribute)........... 5 5 Metoder (methods) 6 5.1 Metodesignatur............................. 7 5.2 Accessor................................. 7 5.3 Mutator................................. 8 5.4 Konstruktør (constructor)....................... 8 6 Sætninger (statements) 9 6.1 Simple sætninger............................ 9 6.1.1 Tildeling (assignment)..................... 9 6.1.2 Metodekald........................... 10 6.2 Sammensatte sætninger........................ 10 6.2.1 Sekvens............................. 11 6.2.2 Selektion............................ 11 Rev: 1241, August 24, 2010 1 manual.tex

6.2.3 Iteration............................. 12 6.3 Blok................................... 14 6.3.1............................ 14 IV Javas klassebibliotek 15 7 Collection 15 7.1 Basale konstruktioner......................... 15 7.1.1 Erklæring og initialisering................... 15 7.1.2 Tilgængelige metoder..................... 15 7.1.3 Gennemløb af collection.................... 16 7.2 Realisering af en-til-mange...................... 16 7.3 Algoritme-mønstre: find-en og find-alle................ 17 7.3.1 Find-en............................. 17 7.3.2 Find-alle............................. 18 8 Comparable og Comparator 20 8.1 Comparable............................... 20 8.2 Comparator............................... 21 8.3 Opsummering.............................. 22 9 Collections klassen 22 2

Del I Introduktion Denne manual indeholder de vigtigste elementer af kurset Introduktion til Programmering ved Datalogisk Institut, Aarhus Universitet. Manualen er under revidering og vil blive udfyldt løbende som kurset skrider frem. Manualen er ment som et opslagsværk der skal give let adgang til de vigtigste elementer i kurset som f.eks. definitioner af begreber, beskrivelse af syntax og lignende. Manualen kan således under og efter kurset bruges som et opslagværk i programmeringsarbejdet. Den nyeste version af manualen er tilgængelig på: http://www.cs.au.dk/dintprog/manual/manual.pdf. 1 Notation I dokumentet bruges kodestumper til at vise generelle former af konstruktioner og til at give eksempler. Kode der står med maskinskrift kan skrives direkte i Java-programmerne, hvorimod kursiv skrift skal erstattes med noget konkret. I nedenstående notationseksempel skal Klassenavn for eksempel erstattes med navnet på den klasse man gerne vil skrive. 1 public class Klassenavn{ 2... 3 } Listing 1: Notationseksempel 3

Del II Begreber I dette afsnit beskrives og relateres vigtige begreber fra kurset. 2 Grundbegreber om programmering Program Et sæt instruktioner. Genererer ofte output. Programmeringssprog Dét sprog i hvilket programmet udtrykkes. Programmør Personen som designer/implementerer/skriver programmet. Processor Den komponent (hardware eller software) der udfører instruktionerne i programmet. Hardware Ordet har mange betydninger, men med hardware menes oftest et stykke udstyr (oftest elektronik) som kan stille én eller flere slags funktionalitet til rådighed for programmet under udførelse. Data Dét input programmet tager samt det output der genereres. En indkøbsseddel kan ses som et program: Programøren er forfatteren af sedlen, programmeringssproget er det danske sprog, processoren er personen der handler ind, hardwaren er indkøbskurven og dataen er varerne. 3 Grundbegreber om modellering Begreb En idé som kan bruges til at udtrykke fælles karakteristika for separate objekter, dvs. en idé om hvordan en bestemt ting bør/kan opføre sig. Fænomen En enkelt instans af et begreb, dvs. én specifik ting som falder under et begrebs paraply. Fænomener tager deres egenskaber fra begreber. I objektorienteret programmering udtrykkes begreber som klasser og fænomener som objekter. Objekter har samme forhold til klasser som fænomener har til begreber. Begreb Fænomener Studerende Rasmus, Stine, Søren,... Fag dintprog, Perspektiverende datalogi, Calculus,... Prøveresultat bestået, ikke bestået, udeblevet,... 4

Del III Sprogkonstruktioner 4 Klasser (Classes) Overordnet består en klasse af tilstand og opførsel. Tilstand kan beskrive som et objekts hukommelse og et objekts opførsel er hvad det kan. Tilstand realiseres vha. feltvariabler (jf. 4.2) og opførsel realiseres med metoder (jf. 5). 4.1 Type Beskriver hvad for en kategori den efterfølgende variabel hører til. Defineres for variabler, retur-værdier, parametre, etc. 1 String 2 int 3 Person 4 double Listing 2: på typer 4.2 Feltvariabel (Fieldvariable, Attribut, Attribute) Et objekts tilstand udgøres af feltvariablerne. Disse erklæres på klasseniveau (og altså ikke inde i metoder), og bruges af objektet til at gemme data specifikt for objektet. Herunder kan du se en række eksempler på erklæringer af feltvariabler. 1 private String name; 2 private int age; 3 private double angle; Listing 3: på feltvariabler Den generelle form på en fejlvariabelerklæring er som i linje 3 herunder. Husk altid at erklære en feltvariabel private. 1 public class Klasse { 2 3 private type variabelnavn; 4 5 metoder 5

6 } Listing 4: Den generelle form på en feltvariabelerklæring 5 Metoder (methods) En metode repræsenterer et objekts opførsel. Det er altså metoderne der sørger for, at vi kan gøre noget og interagere med et objekt. En metode kan være en accessor (jf. 5.2), en mutator (jf. 5.3) eller en konstruktør (jf. 5.4). En metode består af: En metodesignatur (jf. 5.1) En metodekrop som indkapsler metodens funktionalitet. Kroppen består af en række sætninger (jf. 6) mellem to krølleparenteser {}. Den generelle form på en metodeerklæring ses i linje 2 4: 1 public class Klasse { 2 metodesignatur { 3 sætninger 4 } 5 } Listing 5: Den generelle form på en metodeerklæring 1 public void setname(string n) 2 { 3 name = n; 4 } 5 6 public void birthday() 7 { 8 age = age + 1; 9 System.out.println("Happy Birthday!"); 10 } 11 12 public int getage() 13 { 14 return age; 15 } Listing 6: på metoder 6

5.1 Metodesignatur Den første linje i metoden, der navngiver metoden og beskriver (på et meget basalt niveau) hvordan den benyttes. En Overskrift for metoden. Konkret består en metodesignatur af (i nævnte rækkefølge): En access modifier der beskriver fra hvilke klasser der er adgang til metoden. Er metoden public kan den tilgås fra alle klasser og hvis den er private kan den kun tilgås fra den klasse den er erklæret i. En returtype (hvis ikke metoden er en konstruktør). Der beskriver typen (jf. 4.1) af de værdier (om nogen) metoden giver som svar Et metodenavn der bruges når man skal kalde metoden (skal begynde med et lille bogstav medmindre metoden er en konstruktør) (jf. 6.1.2) En start-parentes Et antal parametre, erklæret med type, der beskriver hvad man skal sende med hvis vil kalde metoden en slut-parentes Den generelle form er altså: 1 access modifier returtype metodenavn ( parameter 1, parameter 2,... ) Listing 7: Metodesignaturers generelle form 1 public void settonextdate() 2 public void adddays(int d) 3 public String tostring() Listing 8: på metodesignaturer 5.2 Accessor En metode der bruges til at spørge til et objekts tilstand. Har aldrig void som retur type. Metoden må ikke ændre på objektets tilstand. 7

1 public int getage() 2 { 3 return age; 4 } 5 6 public String getname() 7 { 8 return name; 9 } Listing 9: på acessors 5.3 Mutator En metode der bruges til at ændre et objekts tilstand. Har oftest void som retur type. 1 public void setage(int a) { 2 age = a; 3 } 4 5 public void setname(string n) { 6 name = n; 7 } Listing 10: på mutators 5.4 Konstruktør (constructor) En metode der bruges til at gøre et objekt klar til brug ved at sætte værdierne for feltvariablerne og lign. Navnet på en konstruktør-metode er det samme som navnet på klassen, og konstruktør-metoder har ingen retur type (heller ikke void). Den generelle form ses i linje 2 4: 1 public class Klassenavn{ 2 public Klassenavn( parameter 1, parameter 2,...){ 3 statements 4 } 5 } Listing 11: Konstruktørers generelle form 8

1 public class Person 2 { 3 private String name; 4 private int age; 5 6 /** 7 * Constructor for class Person. 8 * Creates a Person with name n and age a. 9 */ 10 public Person(String n, int a) 11 { 12 name = n; 13 age = a; 14 } 15 16 /** 17 * Constructor for class Person. 18 * Creates a newborn Person with name n. 19 */ 20 public Person(String n) 21 { 22 name = n; 23 age = 0; 24 } 25 } Listing 12: To kontruktører til klassen Person 6 Sætninger (statements) Typisk vil kroppen af en metode bestå af en række sætninger som enten kan være simple (jf. 6.1) eller sammensatte (jf. 6.2). 6.1 Simple sætninger Simple sætninger kendetegnes ved at de typisk udgør en linje i en metode og at denne linje afsluttes af et semi-kolon (;). Man kan godt skrive mere end én simpel sætning per linje (f.eks. x = 42; y = 9;), men koden bliver næsten altid lettere at gennemskue hvis hver simpel sætning står på en linje for sig. 6.1.1 Tildeling (assignment) En tildeling sætter værdien på en variabel. Den generelle form af en assignment (tildeling) kan ses i listing 13. Når en assignment udføres, udregnes først udtrykket på højre side og dernæst gemmes resultatet i variablen på venstre side. 9

1 variabel = udtryk; Listing 13: Assignment 1 age = 29; 2 name = "Peter"; 3 k = Greenfoot.getRandomNumber(20) + 1; Listing 14: på assignments 6.1.2 Metodekald Som beskrevet i afsnit 5, er en metode en måde at indpakke noget funktionalitet opførsel. For at bruge denne funktionalitet, skal man lave et metodekald. Hvis metodekaldet er i samme klasse som den metode man vil kalde er defineret, kan man nøjes med et internt metodekald - hvis ikke skal man bruge et eksternt metodekald. Den generelle form på et internt metodekald er: 1 metode(argumenter); Listing 15: Internt metodekald metode er metodens navn og argumenter er de argumenter som metoden tager. Den generelle form på et eksternt metodekald er: 1 objekt-reference.metode(argumenter); Listing 16: Eksternt metodekald Når man laver et eksternt metodekald, har man også brug for en objekt-reference der specificerer hvilket objekt metoden skal kaldes på. 1 w.eatleaf(); 2 c.moveto(200, 300); 3 eatlead(); Listing 17: på metodekald 6.2 Sammensatte sætninger Sammensatte sætninger kendetegnes ved, at de består af flere sætninger sat sammen. Basalt set findes der fire typer sammensatte sætnigner, sekvens, selektion, itetation og blok, som hver beskrives herunder. 10

6.2.1 Sekvens Er en række sætninger efter hinanden som udfører en eller anden form for process. Givet to sætninger A og B (simple eller sammensatte) er den generelle form: 1 A 2 B Listing 18: Sekvens I listing 19, er linje 2 3 et eksempel på en sekvens af sætninger. Ligeledes er for-løkken i linje 1 4 og linje 5 to sammenstillede sætninger (hvoraf den ene er sammensat). 1 for(int i=0;i<10;i++){ 2 move(i*10); 3 turn(i*90); 4 } 5 System.out.println("Done!") Listing 19: sekvenser 6.2.2 Selektion En selektion er en sætning som via en betingelse opstiller et enten-eller udtryk og derved udfører en række sætninger alt efter hvad udfaldet af en betingelse bliver. Den generelle form ses i listing 20. Bemærk at else-delen i linje 3 4 i kan udelades. 1 if (betingelse) 2 A 3 else 4 B Listing 20: Selektion 1 r = Greenfoot.getRandomNumber(100); 2 if (r < 20) 3 { 4 turn(40); 5 } 6 else 7 { 8 turn(-40); 9 } 11

Listing 21: på selektion 6.2.3 Iteration Iteration er en sætning som udfører en anden sætning en eller flere gange. Der findes tre typer iterations-sætniger: for-løkker, while-løkker og udvidede for-løkker. for-løkker består grundlæggende af fire elementer. En initialiserings sætning hvor en løbevariabel erklæres og initialiseres, en løbe-betingelse der afgør om iterationen skal forsætte, en inkrementering af løbevariablen og endelig de sætninger der skal udføres et antal gange. Den generelle form ses herunder: 1 for (initialisering; betingelse; inkrementering) { 2 sætninger 3 } Listing 22: for-løkke Når en for-løkke skal udføres gøres følgende: 1. initialiserings sætningen udføres. Dette skulle gerne resultere i at der erklæres en løbevariabel og at denne initialiseres. Det kunne f.eks. være int i = 0. 2. Det checkes om betingelsen er opfyldt. Hvis dette ikke er tilfældet, stopper for-løkken og udførslen forsætter uden for for-løkken. 3. Er betingelsen opfyldt udføres de sætninger der er inde i for-løkken. 4. Herefter udføres inkrementerings-sætningen og der gås til skridt 2. 1 for(int i=0;i<10;i++){ 2 move(i*10); 3 turn(i*90); 4 } Listing 23: på for-løkker Udvidet for-løkke bruges til at iterere over en collection (se afsnit 7), f.eks. en liste. Et eksempel kunne være, at man gerne ville udføre et stykke kode for hvert element i en liste. Den udvidede for-løkke består af fire elementer. En objektreference til en collection af en bestemt type, en løbe-variabel og en række statements (sætninger), der skal udføres. Den generelle form er: 12

1 for (type variabel : collection) { 2 statements 3 } Listing 24: Den udvidede for-løkke 1 for (Die d : mydiecup) 2 { 3 d.roll(); 4 } Listing 25: Eksempel på udvidede for-løkker while-løkken består af to elementer: en løbe-betingelse og en række statements (sætninger) der skal udføres. Den generelle form er: 1 while( betingelse ) { 2 statements 3 } Listing 26: While-løkken Inden hver udførelse af while-løkkens indre statements tjekkes om løbe-betingelsen er opfyldt. Hvis dette er tilfældet, udføres de indre statements. Hvis ikke, forsætter udførelsen efter while-løkken. 1 int i = 0; 2 while( i<10 ){ 3 move(i*10); 4 turn(i*90); 5 i++; 6 } 7 8 while ( true ) { 9 System.out.println("Im looping forever"); 10 } Listing 27: på while-løkken while-løkken i linje 1 6 gør det samme som for-løkken i listing 23. 13

6.3 Blok En blok er en måde at lave en række at sætninger til en enkelt sætning. Den generelle form er: 1 { 2 statements 3 } Listing 28: Blok En blok bruges tit som kroppen på en if-sætning eller en for-løkke. 6.3.1 1 for(int i=0;i<10;i++) 2 { 3 move(i*10); 4 turn(i*90); 5 } Listing 29: Eksempel på en blok 14

Del IV Javas klassebibliotek 7 Collection Collections giver mulighed for at opbevare mange objektreferencer i ét objekt. Samtidig giver en collection muligheden for en-til-mange relationer. Dette betyder at et objekt kan relatere til flere objekter. Et eksempel, hvor man kan bruge en collection, kan være at man har en række Adresse-objekter og at man derudfra ønsker at lave en Adressebog som kan indeholde alle Adresse-objekterne. En collection felt-variabel i Adressebog-objektet kan her bruges til at indeholde referencer til alle Adresse-objekterne. Et andet scenarie kan være at man ønsker at opbevare et antal tekststrenge (String-objekter) i en collection. 7.1 Basale konstruktioner 7.1.1 Erklæring og initialisering Det første man skal sørge for er at importere Java pakken java.util.arraylist! Hvis man er doven kan man bruge java.util.*, som importerer alle klasser fra java.util pakken. Erklæring og initialisering foregår i det store hele, som ved enhver anden variabel. I eksemplet herunder er taget udgangspunkt i, at vi ønsker en liste der kan indeholde objekter af typen String. 1 ArrayList<String> listofstring; 2 listofstring = new ArrayList<String>(); Listing 30: Erklæring og initialisering af en collection-variabel 7.1.2 Tilgængelige metoder Man kan tilføje et String-objekt til listofstrings, via metoden add som findes i ArrayList, på følgende måde: 1 listofstrings.add("string1"); Listing 31: Tilføje til en collection For at finde ud af hvor mange objekter der er gemt i ArrayList-objektet listof Strings kan man bruge metoden size() der returner hvor mange elementer der er i en given collection: 1 listofstrings.size(); Listing 32: Inspektion af størrelsen på en collection 15

Der findes adskillige andre. Hvis man vil se en liste over alle tilgængelige metoder kan en sådan findes i Java API en under f.eks. ArrayList. 7.1.3 Gennemløb af collection For at løbe igennem alle elementer i ArrayList-objektet listofstrings, kan man bruge en udvidet for-løkke (jf. 6.2.3) og f.eks. bruge System.out.println()- metoden til at printe hvert enkelt objekt ud med. Resultatet vil se sådan ud: 1 for(string s : listofstrings){ 2 System.out.println(s); 3 } Listing 33: Udskrivning af elementer 7.2 Realisering af en-til-mange Figur 1 nedenfor er et UML diagram, der illustrerer en en-til-mange relation mellem klasserne A og B. Betydningen af diagrammet er, at hvert A-objekt kender til et eller andet antal B-objekter. Til hvert A-objekt er der et antal B-objekter der hører til. A * B Figur 1: En-til-mange relation For at realisere sådan en en-til-mange relation i Java-kode skal man gøre tre ting. Man skal: Importere den collection man vil bruge. Det kunne f.eks. være en ArrayList - i det tilfælde skal man skrive: import java.util.arraylist Erklære en feltvariabel med passende type. Typen skal være typen på den collection man vil bruge og som man har importeret Initialisere den ovenfor erklærede feltvariabel i konstruktøren. Vil man altså realisere en en-til-mange relation mellem to klasser, A og B, som i figur 1, er den generelle form som følger: 1 import java.util.collection-klasse; 2 public class A { 3 private Collection-klasse<B> feltvariabel-navn; 4 5 public A(){ 16

6 feltvariabel-navn = new Collection-klasse<B>(); 7 } 8 } Listing 34: Realisering af en en-til-mange relation I listing 34, importeres i linje 1, der erklæres i linje 3 og der initialiseres i linje 6. I Listing 35 realiseres en-til-mange relationen illustreret i figur 2. AddressBook * Person Figur 2: Eksempel på realisering af en en-til-mange relation 1 import java.util.arraylist: 2 public class AddressBook { 3 private ArrayList<Person> persons; 4 public AddressBook(){ 5 persons = new ArrayList<Person>(); 6 } 7 } Listing 35: Eksempel på realisering af en en-til-mange relation 7.3 Algoritme-mønstre: find-en og find-alle 7.3.1 Find-en Princippet i en find-en-algoritme, er at den leder en liste igennem, indtil den møder et element der matcher betingelserne. Den holder så op med at lede og returnerer det element den har fundet. Den generelle form kan ses i listing 36 nedenfor. Element-type er typen på de elementer der er i listen liste. I linje 2 6 gennemløbes listen liste ved hjælp af en udvidet for-løkke (jf. 6.2.3) og det første element e der gør søge-udtrykket udtryk (linje 3) sandt, returneres i linje 4. Hvis intet element gør søge-udtrykket sandt, returneres null (linje 7). 1 public Element-type metodennavn(parametre) { 2 for ( Element-type e : liste ) { 3 if ( udtryk) { 4 return e; 17

5 } 6 } 7 return null; 8 } Listing 36: Den generelle form på en find-en algoritme 1 public Dice findonedice(int eyes) { 2 for ( Dice d : dice ) { 3 if ( d.geteyes() == eyes ) { 4 return d; 5 } 6 } 7 return null; 8 } 9 10 public Pixel findonepixel(int color) { 11 for ( Pixel p : pixels ) { 12 if ( p.getcolor() == color) { 13 return p; 14 } 15 } 16 return null; 17 } 18 19 public Person findoneperson(string q) { 20 for ( Person p : persons ) { 21 if(p.getfirstname().contains(q) p.getlastname().contains(q)) { 22 return p; 23 } 24 } 25 return null; 26 } Listing 37: på find-en algoritmer 7.3.2 Find-alle En find-alle-algoritme, søger ligesom en find-en-algoritme en liste igennem. Forskellen, ligger i at den laver en ny liste med alle de objekter der matcher søgekriterierne, og returnerer så denne liste. Den generelle form kan ses i listing 38 nedenfor. Element-type er typen på de elementer der er i listen liste. I linje 3 7 gennemløbes listen liste ved hjælp af en udvidet for-løkke (jf. 6.2.3) hver gang et element e gør søge-udtrykket udtryk 18

(linje 4) sandt, tilføjes det til listen result. Når for-løkken er færdig vil listen re sult indeholde alle de elementer der opfylder søge-udtrykket og derfor returneres result i linje 8. 1 public ArrayList<Element-type> metodennavn(parametre) { 2 ArrayList<Element-type> result = new ArrayList<Element-type>(); 3 for ( Element-type e : liste ) { 4 if ( udtryk) { 5 result.add(e); 6 } 7 } 8 return result; 9 } Listing 38: Den generelle form på en find-alle algoritme 1 public ArrayList<Dice> findalldice(int eyes) { 2 ArrayList<Dice> result = new ArrayList<Dice>(); 3 for ( Dice d : dice ) { 4 if ( d.geteyes() == eyes ) { 5 result.add(d); 6 } 7 } 8 return result; 9 } 10 11 public ArrayList<Pixel> findallpixels(int color) { 12 ArrayList<Pixel> result = new ArrayList<Pixel>(); 13 for ( Pixel p : pixels ) { 14 if ( p.getcolor() == color) { 15 result.add(p); 16 } 17 } 18 return result; 19 } 20 21 public ArrayList<Person> findallpersons(string q) { 22 ArrayList<Person> result = new ArrayList<Person>(); 23 for ( Person p : persons ) { 24 if(p.getfirstname().contains(q) p.getlastname().contains(q)) { 25 result.add(p); 26 } 27 } 28 return result; 29 } 19

Listing 39: på find-alle algoritmer 8 Comparable og Comparator Comparable og Comparator er to interfaces der gør det muligt at fortælle Java hvordan objekter skal sammenlignes. Det er nyttigt hvis man f.eks. har brug for at sortere en liste med objekter: Hvis objekterne kan sammenlignes, enten vha. Comparable eller Comparator, kan man bruge Collections klassens sort metode. Begge interfaces implementeres ved at implementere en enkelt metode (compare To for Comparable og compare for Comparator). Denne metode skal sammenligne to objekter a og b og returnere et heltal: hvis a < b så returneres -1 hvis a > b så returneres 1 hvis a = b så returneres 0 8.1 Comparable Comparable bruges til at udtrykke en naturlig ordning på objekter. Hvis man vælger at anvende Comparable kan man derfor kun specificere én måde hvorpå elementer skal sammenlignes. Når Comparable implementeres skal compareto metoden skrives direkte i den klasse der skal implementere Comparable interfacet. Antag at der findes en Person-klasse som specificeret i UML diagrammet i figur 3. Person int age double weight String name Figur 3: En Person klasse Ønsker man nu at sammenligne Person-objekter ved at sammenligne deres alder, kan dette gøre ved at implementere Comparable interfacet i Person klassen, som vist i listing 40. Bemærk at det a og b der refereres til i det ovenstående i dette tilfælde er this og other. 1 public class Person implements Comparable<Person>{ 2... 20

3 public int compareto(person other){ 4 if (this.age < other.age) return -1; 5 if (this.age > other.age) return 1; 6 return 0; 7 } 8 } Listing 40: Implementation af Comparable Nogen gange ønsker man også at have en sekundær ordning. Altså en alternativ måde at sammenligne objekter på, hvis objekterne viser sig at være ens i forhold til det primære sammenligningskriterie. F.eks. kunne man forestille sig for en Person, at hvis to personer har samme alder, så ønsker vi at sammenligne dem på deres navn i stedet. Dette kan gøres som vist i listing 41. 1 public class Person implements Comparable<Person>{ 2... 3 public int compareto(person other){ 4 if (this.age < other.age) return -1; 5 if (this.age > other.age) return 1; 6 return this.getname().compareto(other.getname()); 7 } 8 } Listing 41: Implementation af Comparable Ovenstående er også et eksempel på hvad man gør, hvis det ikke er tal der skal sammenlignes. I sådanne tilfælde kan < og > ikke bruges. Men det vil tit være tilfældet at de egenskaber man vil sammenligne selv har en compareto metode. I ovenstående eksempel har vi gjort brug af at et navn har typen String, og at String klassen allerede implementerer Comparable interfacet. Når vi i sidste linje kalder metoden compareto er det altså den der sammenligner strenge. 8.2 Comparator Hvis man ønsker at kunne sammenligne objekter på mange forskellige måder, kan man med fordel anvende Comparator interfacet. I modsætning til Comparable interfacet skal man nu oprette en ny klasse der implementerer Comparator interfacet for hver type sammenligning man ønsker. Sammenligningen fra forrige afsnit kan således også lægges i en klasse for sig selv vha. Comparator-interfacet. Dette ses i listing 42. Bemærk igen at det a og b der refereres til i det ovenstående i dette tilfælde er a og b. 1 public class AgeComparator implements Comparator<Person>{ 2 public int compare(person a, Person b){ 3 if (a.getage() < b.getage()) return -1; 21

4 if (a.getage() > b.getage()) return 1; 5 return 0; 6 } 7 } Listing 42: Implementation af Comparator Ønsker man i stedet at sammenligne på en persons navn kan man også lave en NameComparator som vist i listing 43. 1 public class NameComparator implements Comparator<Person>{ 2 public int compare(person a, Person b){ 3 return a.getname().compareto(b.getname()); 4 } 5 } Listing 43: Implementation af Comparator På denne måde kan man have en hel masse forskellige måder at sammenligne personer på. I forskellige sammenhænge kan man så vælge den man har brug for. Som man kan se ved sammenligning af eksemplerne i listing 40 og 42 ligner compareto og compare metoderne meget hinanden. Og de samme teknikker kan derfor også bruges i de to tilfælde. 8.3 Opsummering Comparable og Comparator interfacesene bruges til at angive hvordan objekter af samme type skal sammenlignes. Hvilken man vil bruge afhænger af om man ønsker at objekter skal kunne sammenlignes på én eller flere måder. 9 Collections klassen Vi skal nu se hvordan man kan bruge en implementation af Comparable eller Com parator interfacet til noget nyttigt. Klassen Collections indeholder en masse praktiske metoder til f.eks. at sortere lister, eller finde det største eller mindste element i en liste. Disse metoder kan bruges så længe at elementerne i listen enten implementerer Comparable eller Comparator interfacet. Hvordan metoderne i Col lections bruges afhænger af om det er Comparable eller Comparator man bruger. Vi vil nu se på nogle eksempler af brug af metoderne i Collections klassen, både vha. Comparable og Comparator. Lad A og B være to klasser med en indbyrdes en-til-mange relation som vist i UML diagrammet i figur 4. Det vil altså sige at et A objekt indeholder mange B objekter, de kunne f.eks. ligge i en liste. 22

A * B Figur 4: En-til-mange relation Eksempel med Comparable Givet et A objekt lad os antage at vi ønsker at lave en metode der sorterer og udskriver alle de tilhørende B objekter. Til det formål kan vi bruge metoden Col lections.sort, såfremt at B har implementeret Comparable interfacet. I eksemplet er variablen liste en liste i klassen A som indeholder objekter af typen B. Metoden kan derfor nu se ud som vist i listing 44. 1 public void sortandprint() { 2 Collections.sort(liste); 3 System.out.println(liste); 4 } Listing 44: Brug af Collections.sort vha. Comparable Bemærk igen at vi her har antaget at klassen B allerede implementerer Compa rable interfacet. Eksempel med Comparator Lad os se på et lignende eksempel, men hvor Comparator interfacet er brugt. Når vi siger at vi har implementeret Comparator interfacet for en klasse, i dette tilfælde B, har vi altså lavet en ny klasse der implementerer Comparator interfacet for klassen B. Lad os kalde denne klasse for FirstComparator. Man kan selvfølgelig også i dette tilfælde sortere sine elementer som før, men lad os i stedet se på hvordan man kan finde et mindste element i listen liste. En metode der udfører denne opgave kan ses i listing 45. 1 public B findminimum() { 2 return Collections.min(liste, new FirstComparator()); 3 } Listing 45: Brug af Collections.min vha Comparator Bemærk at i dette eksempel, i modsætning til eksemplet med Comparable, skal vi her eksplicit angive hvordan vi ønsker at elementerne i listen skal sammenlignes. Vi kunne således også have haft en SecondComparator, ThirdComparator, osv. som alle kunne sammenligne på forskellige måder. Hvilken vi brugte som argument i kaldet til metoden Collections.min, ville så have betydning for hvad resultatet blev. 23

At vi lige valgte at bruge Comparable sammen med sort og Comparator sammen med min er ikke af betydning. Der findes varianter af begge metoder i Col lections klassen der arbejder sammen med både Comparable og Comparator. Der findes desuden masser af andre nyttige metoder i Collections klassen, du kan se dem alle ved at kigge i Java API en. 24

Indeks ;, 9 =, 9 Access modifier, 7 Accessor, 7 Assignment, 9 Attribut, 5 Attribute, 5 Begreb, 4 Class, Klasse, 5 Collections, 22 Comparable, 20 Comparator, 20, 21 Constructor, Konstruktør, 8 Programmør, 4 Programmeringssprog, 4 public, 7 Returtype, 7 Sætninger, Statements, 9 Sekvens, 11 Selektion, 11 Statements, Sætninger, 9 Tildeling, 9 Udvidet for-løkke, 12 while-løkke, 13 Data, 4 else, 11 Fænomen, 4 Feltvariabel, 5 Fieldvariable, 5 for-løkke, 12 Hardware, 4 if, 11 Iteration, 12 Klasse, Class, 5 Konstruktør, Constructor, 8 Method, Metode, 6 Metode, Method, 6 Metodekald, 10 Metodesignatur, 7 Mutator, 8 Parameter, 7 private, 7 Processor, 4 Program, 4 Rev: 1241, August 24, 2010 25 manual.tex