Forelæsning 3.1 Collections Javas for-each løkke Afleveringsopgave 3.2: Generaliseret raflebæger dIntProg, E14
iTunes – et motiverende eksempel Playlist Track dIntProg, E14
* ≈ én-til-mange relation iTunes klassemodel Player void add(PlayList p) List<PlayList> find(String q) void print() * Playlist PlayList String getName() void addTrack(Track t) void print() Track shortestTrack() Track longestTrack() List<Track> search(String q) List<Track> longerThan(int r) void shuffle() * Track * ≈ én-til-mange relation Vilkårligt mange objekter af den pågældende type Track String getName() String getArtist() int getTime() dIntProg, E14
? Andet eksempel * En adressebog hvor man kan: Problem Tilføje kontakter (personer) – så mange som man vil Udskrive adressebogen Finde et telefonnummer, givet et navn Finde gennemsnitsalderen på kontakterne Problem Hvordan kan man huske på personerne? Hvordan realiseres én-til-mange relationen? AddressBook void addPerson(Person p) void print() String getPhone(String name) int averageAge() Person String getName() String getNumber() int getAge() ? * dIntProg, E14
Collections – Samlinger af objekter Objektreferencer for at holde fast i et objekt skal der bruges en objektreference (en variabel) for at holde fast i 10.000 objekter skal der bruges 10.000 objektreferencer... Collections en særlig slags objekter, der kan opbevare (referencer til) objekter f.eks. ArrayList java.util en pakke, der bl.a. indeholder klasserne i Javas såkaldte collection framework dIntProg, E14
Eksempel: Liste af personer public void testMethod() { Person person; ArrayList<Person> persons = new ArrayList<Person>(); // add some persons person = new Person( "Jeppe", "89425665", 33 ); persons.add(person); person = new Person( "Ole", "32789878", 28 ); person = new Person( "Linda", "90023234", 21 ); } dIntProg, E14
Objektmodel for personeksempel persons: ArrayList<Person> 0 1 2 size() = 3 name: number: age: 33 ”Jeppe” ”89425665” name: number: age: 28 ”Ole” ”32789878” name: number: age: 21 ”Linda” ”90023234” person: dIntProg, E14
Realisering af én-til-mange – UML AddressBook Person String getName() String getNumber() int getAge() ArrayList<Person> persons void addPerson(Person p) void print() String getPhone(String name) int averageAge() * dIntProg, E14
Realisering af en-til-mange - Kode For at realisere en en-til-mange relation i koden skal man gøre 3 ting: Importere klassen ArrayList import java.util.ArrayList; Erklære en feltvariablen af typen ArrayList<…> private ArrayList<Person> persons; Initialisere feltvariablen i konstruktøren public AddressBook(){ persons = new ArrayList<Person>(); } dIntProg, E14
Collection – parametriseret type ArrayList<E> lister (sekvenser) af objekter af typen E public class ArrayList<E> { boolean add(E e){…} void add(int index, E element){…} E get(int index){…} boolean contains (Object o){…} boolean isEmpty(){…} Iterator<E> iterator(){…} boolean remove(Object o){…} int size(){…} ... } Implementer addPerson metoden Se på Javadoc Se JavaDoc... dIntProg, E14
Gennemløb med Javas for-each-løkke public void testMethod() { Person person; ArrayList<Person> persons = new ArrayList<Person>(); // add some persons person = new Person( ”Jeppe”, ”89525665”, 33 ); persons.add(person); ... // for each person print for ( Person person : persons ) { System.out.println(person); } Implementer print-metoden dIntProg, E14
Find gennemsnitsalder Specifikation (hvad) /** * return the average age of the people in the addressbook */ public int averageAge() { ??? } dIntProg, E14
Implementation (hvordan) /** * return the average age of the people in the * address book */ public int averageAge() { return ageSum() / persons.size(); } /** * return the sum of the age of the people in the * address book */ private int ageSum() { ??? } dIntProg, E14
Implementation af ageSum /** * return the sum of the age of the people in the * address book */ private int ageSum() { int result= 0; // accumulate the sum of ... in variable result return result; } dIntProg, E14
Implementation af ageSum /** * return the sum of the age of the people in the * address book */ private int ageSum() { int result= 0; for (Person person : persons) { result += person.getAge(); } return result; dIntProg, E14
Opsummering ArrayLists (og andre collections) kan bruges til at realisere én-til-mange relationer Importere klassen ArrayList import java.util.ArrayList; Erklære en feltvariablen af typen ArrayList<…> private ArrayList<Person> persons; Initialisere feltvariablen i konstruktøren public AddressBook(){ persons = new ArrayList<Person>(); } Javas for-each-løkke kan bruges til at gennemløbe ArrayLists og andre collections for (Person person : persons) {...} dIntProg, E14
Aflevering 3.2: Generaliseret raflebæger (DieCup2) I indeværende uge laver i et BlueJ projekt med et raflebæger og to terninger Terning Raflebæger dIntProg, E14
Aflevering 3.2: Generaliseret raflebæger (fortsat) I den kommende uge: Lav en TestDriver klasse med en metode, som kan: Skabe et raflebæger med to terninger. Lave et kast med terningerne. Udskrive det samlede antal øjne i kastet. Generaliser raflebæger så der kan være et vilkårligt antal terninger Brug ArrayList<Die>. Skriv ny testmetode. Generaliser terning så der kan være et vilkårligt antal øjne dIntProg, E14