23
Forelæsning Uge 3 – Mandag ArrayList Collection (samling af objekter) med variabelt antal elementer Der er mange andre Collection typer (se Collection interfacet i JavaDoc) MusicOrganizer projektet Eksempel på brug af ArrayList Javas for-each løkke Alternativ til den almindelige for løkke Velegnet til gennemløb af arraylister (og andre collections) Java API (grænsefladen til Javas klassebibliotek) Afleveringsopgave: Raflebæger 3 (DieCup 3) Projekt Euler og CodingBats findes en masse ekstra opgaver, hvor I kan øve jer i Java programmering, hvis I har tid tilovers Links under Uge 3 på Ugeoversigten

Forelæsning Uge 3 –Mandag - Aarhus Universitet...Forelæsning Uge 3 –Mandag • ArrayList – Collection (samling af objekter) med variabelt antal elementer – Der er mange andre

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Forelæsning Uge 3 –Mandag - Aarhus Universitet...Forelæsning Uge 3 –Mandag • ArrayList – Collection (samling af objekter) med variabelt antal elementer – Der er mange andre

Forelæsning Uge 3 – Mandag• ArrayList

– Collection (samling af objekter) med variabelt antal elementer– Der er mange andre Collection typer

(se Collection interfacet i JavaDoc)

• MusicOrganizer projektet– Eksempel på brug af ArrayList

• Javas for-each løkke– Alternativ til den almindelige

for løkke– Velegnet til gennemløb af

arraylister (og andre collections)

• Java API (grænsefladen tilJavas klassebibliotek)

• Afleveringsopgave:Raflebæger 3 (DieCup 3)

På Projekt Euler og CodingBats findes en masse ekstra opgaver, hvor I kan øve jer i Java programmering, hvis I har tid tiloversLinks under Uge 3 på Ugeoversigten

Page 2: Forelæsning Uge 3 –Mandag - Aarhus Universitet...Forelæsning Uge 3 –Mandag • ArrayList – Collection (samling af objekter) med variabelt antal elementer – Der er mange andre

● Collections – Samlinger af objekter

• Objektreferencer– for at holde fast i et objekt skal der bruges en objekt-reference (en

variabel)– for at holde fast i 10.000 objekter skal der bruges 10.000 objekt-

referencer…

• Collections (objektsamlinger)– 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

2

Page 3: Forelæsning Uge 3 –Mandag - Aarhus Universitet...Forelæsning Uge 3 –Mandag • ArrayList – Collection (samling af objekter) med variabelt antal elementer – Der er mange andre

Klassediagram for musikafspiller

Track

String getName()String getArtist()int getTime()

Player

void add(PlayList p)List<PlayList> search(String q)void print()

*PlayList

String getName()void addTrack(Track t)void print()Track shortestTrack()Track longestTrack()List<Track> shorterThan(int length)List<Track> search(String q)void shuffle()

*• * angiver én-til-mange relation

– Vilkårligt mange objekter af den pågældende type

– Hvordan realiseres dette?

Playlist

Track

3

Page 4: Forelæsning Uge 3 –Mandag - Aarhus Universitet...Forelæsning Uge 3 –Mandag • ArrayList – Collection (samling af objekter) med variabelt antal elementer – Der er mange andre

Klassediagram for adressebog• Man skal kunne udføre følgende operationer

– Tilføje et vilkårligt antal personer– Udskrive adressebogen– Finde et telefonnummer (via personens navn)– Finde gennemsnitsalderen på personerne

• Problem– Hvordan kan AddressBook "huske" alle personerne?– Hvordan realiseres én-til-mange relationen?

• Svar– Det kan vi gøre ved hjælp af en arrayliste

AddressBookvoid addPerson(Person p)void print()String getPhone(String name)double averageAge()

PersonString getName()String getNumber()int getAge()

*

4

Page 5: Forelæsning Uge 3 –Mandag - Aarhus Universitet...Forelæsning Uge 3 –Mandag • ArrayList – Collection (samling af objekter) med variabelt antal elementer – Der er mange andre

Eksempel: Index over bekendte// Feltvariabelprivate ArrayList<Person> persons;...

// Initialisering (i konstruktør)persons = new ArrayList<>();

...

// Skab personer og tilføj dem til arraylistenpublic void createIndex() {

Person person; // Lokal variabel

person = new Person( "Jeppe", "89425665", 33 ); persons.add(person);

person = new Person( "Ole", "32789878", 28 ); persons.add(person);

person = new Person( "Linda", "90023234", 21 ); persons.add(person);

} 5

Objekterne i arraylisten skal være af type Person

Page 6: Forelæsning Uge 3 –Mandag - Aarhus Universitet...Forelæsning Uge 3 –Mandag • ArrayList – Collection (samling af objekter) med variabelt antal elementer – Der er mange andre

Objektdiagram for createIndexpersons:ArrayList<Person>

6

0

ArrayList<Person>

1 2 size() = 0123

namenumberage 33

Person String"Jeppe"

String"89425665"

namenumberage 28

Person String"Ole"

String"32789878"

namenumberage 21

PersonString

"Linda"

String"90023234"

Bemærk at index'ernenummereres fra 0 til size()-1

persons.add(person);

person:Person

Page 7: Forelæsning Uge 3 –Mandag - Aarhus Universitet...Forelæsning Uge 3 –Mandag • ArrayList – Collection (samling af objekter) med variabelt antal elementer – Der er mange andre

Realisering af en-til-mange relation – Java• For at realisere en en-til-mange relation i koden skal man

gøre 3 ting

7

1. Importere klassen ArrayList

import java.util.ArrayList;

private ArrayList<Person> persons;

public AddressBook() {persons = new ArrayList<>();

}

3. Initialisere feltvariablen (gøres normalt i konstruktøren)

2. Erklære en feltvariabel af typen ArrayList<…>

IM

ER

KO

IMERKO reglen Husk de runde parenteser• Kald af konstruktør• Ellers typenavn

Vi behøver ikke at gentage type parameteren til ArrayList

Page 8: Forelæsning Uge 3 –Mandag - Aarhus Universitet...Forelæsning Uge 3 –Mandag • ArrayList – Collection (samling af objekter) med variabelt antal elementer – Der er mange andre

ArrayList er en parametriseret type

public class ArrayList < E > {boolean add( E e){…}void add(int index, E element){…}boolean remove(Object o){…}E get(int index){…}boolean contains (Object o){…}boolean isEmpty(){…}int size(){…}...

}

Flere detaljer: se JavaDoc... Link (senere i forelæsningen)

8

Type parameter (i <…> parenteser)Klassenavn

• Dokumentationen for ArrayList fortæller, at der bl.a. er nedenstående metoder:

Page 9: Forelæsning Uge 3 –Mandag - Aarhus Universitet...Forelæsning Uge 3 –Mandag • ArrayList – Collection (samling af objekter) med variabelt antal elementer – Der er mange andre

Arrayliste med heltal• Parameteren til ArrayList skal være en objekt type

– Det betyder, at man ikke kan skrive ArrayList<int>– I stedet skal man skrive ArrayList<Integer>

• Integer er en objekt type med de "samme værdier" som den primitive type int– Integer er en wrapper klasse for int (wrapper = indpakning)– Integer værdier konverteres automatisk til int værdier (og omvendt), når

der er behov for det

• Eksempel

9

private int i;private ArrayList<Integer> list;...list.add(i); // int Integeri = list.get(3); // Integer int

Page 10: Forelæsning Uge 3 –Mandag - Aarhus Universitet...Forelæsning Uge 3 –Mandag • ArrayList – Collection (samling af objekter) med variabelt antal elementer – Der er mange andre

Runtime exceptions• Husk at indices begynder

ved 0 og slutter ved size()-1

10

public class Person {private String name;private String number;private int age;...

}

import java.util.ArrayList;public class TestDriver {public static void runTest(){

ArrayList<Person> persons = new ArrayList<>();

persons.add(new Person("Jeppe", "89425665", 33));persons.add(new Person("Ole", "32789878", 28));persons.add(new Person("Linda", "90023234", 21));

System.out.println(persons.get(1));System.out.println(persons.get(3));System.out.println(persons.get(2));

}}

IndexOutOfBoundsException

Link til det sted, hvor fejlen opstod

Der er mange andre typer exceptions• ArithmeticException: / by zero• NullPointerException

Page 11: Forelæsning Uge 3 –Mandag - Aarhus Universitet...Forelæsning Uge 3 –Mandag • ArrayList – Collection (samling af objekter) med variabelt antal elementer – Der er mange andre

● MusicOrganizer – brug af ArrayList

11

MusicOrganizer

void addTrack(String track)

void removeTrack(int index)

int getNumberOfTracks()

void printTrack(int index)

• Vi vil lave en klasse som kan holde styr på vores musiknumre– Klassen minder lidt om musikafspilleren fra BlueJ bogens kapitel 4, men

den gør nogle lidt andre ting (kartotek over musik – ingen aktiv afspilning)– I første version repræsenteres hvert musiknummer ved hjælp af en

tekststreng (String)– Senere skal vi indføre en Track klasse til at repræsentere musiknumre

Tilføj nummerFjern nummerAntal numre?

Udskriv nummer

Page 12: Forelæsning Uge 3 –Mandag - Aarhus Universitet...Forelæsning Uge 3 –Mandag • ArrayList – Collection (samling af objekter) med variabelt antal elementer – Der er mange andre

Oprettelse af arraylisteimport java.util.ArrayList;

/*** A class to hold details of tracks.*/public class MusicOrganizer {// An ArrayList for storing the// file names of music files.private ArrayList<String> tracks;

/*** Create a MusicOrganizer.*/

public MusicOrganizer() {tracks = new ArrayList<>();

}...// Methods omitted...

}

12

IM

ER

KO

IMERKO reglen

1. ImportereArrayList klassen

3. Initialiserefeltvariablen i konstruktøren

2. Erklæreen feltvariabel af type ArrayList<…>

Page 13: Forelæsning Uge 3 –Mandag - Aarhus Universitet...Forelæsning Uge 3 –Mandag • ArrayList – Collection (samling af objekter) med variabelt antal elementer – Der er mange andre

Tilføjelse og fjernelse af musiknumre/*** Add a track to the collection.* @param track Track to be added.*/public void addTrack(String track) {tracks. add(track);

}

13

Metode i ArrayList klassen

/*** Remove a track from the collection.* @param index Index of the track to be removed.*/public void removeTrack(int index) {if( index >= 0 && index < tracks.size() ) {

tracks. remove(index);}

}

Metode i ArrayList klassen

Inden vi kalder remove metoden, tester vi om indexet er i brug(så vi undgår at få en IndexOutOfBoundsException)

Page 14: Forelæsning Uge 3 –Mandag - Aarhus Universitet...Forelæsning Uge 3 –Mandag • ArrayList – Collection (samling af objekter) med variabelt antal elementer – Der er mange andre

Antal numre og udskrivning/*** Return the number of tracks in the collection.* @return Number of tracks in the collection.*/public int getNumberOfTracks() {return tracks. size();

}

14

Metode i ArrayList klassen

/*** Prints a track from the collection.* @param index Index of the track to be printed.*/public void printTrack(int index) {if( index >= 0 && index < tracks.size() ) {

String track = tracks. get(index);

System.out.println(track);}

}Metode i ArrayList klassen

Inden vi kalder get metoden tester vi om indexet er i brug (så vi undgår at få en IndexOutOfBoundsException)

Udskrift

Page 15: Forelæsning Uge 3 –Mandag - Aarhus Universitet...Forelæsning Uge 3 –Mandag • ArrayList – Collection (samling af objekter) med variabelt antal elementer – Der er mange andre

● Javas for-each løkke (udvidet for løkke)

15

for ( String track : tracks ) {

System.out.println(track);}

• Bruges til at gennemløbe alle elementer i en Arrayliste og gøre "et eller andet" ved dem

• Kan bruges på alle Collections (og på Arrays)

Keyword(reserveret ord)

KROP(de sætninger der skal gentages, dvs. udføres på alle elementer i arraylisten)

Erklæring af lokal variabel

Reference til den arrayliste, der skal gennemløbes

/*** Print all tracks from the collection.*/public void printAllTracks() {for(String track : tracks) {

System.out.println(track);}

}

• for-each løkken gør det nemt at lave en metode, der udskriver alle musiknumre

Page 16: Forelæsning Uge 3 –Mandag - Aarhus Universitet...Forelæsning Uge 3 –Mandag • ArrayList – Collection (samling af objekter) med variabelt antal elementer – Der er mange andre

Find gennemsnitsalder

16

/*** return the average age of the* people in the address book*/public double averageAge() {

double sum = 0;

for(Person person : persons) {sum += person.getAge();

}return sum / persons.size();

}

Angiver at værdien af udtrykket på højresiden lægges til variablen på

venstresiden

Hjælpevariablen sum erklæres til at være en double (for at undgå afrunding ved division)

Page 17: Forelæsning Uge 3 –Mandag - Aarhus Universitet...Forelæsning Uge 3 –Mandag • ArrayList – Collection (samling af objekter) med variabelt antal elementer – Der er mange andre

Udskrift af arrayliste• Elementerne i en arrayliste kan udskrives via sætningen

System.out.println(list);

17

• Alle klasser er subklasser af klassen Object• Indeholder en metode som returnerer en tekstrepræsentation af det

pågældende objekt• Det er denne metode, der anvendes til at få en tekstrepræsentation af

objekterne i arraylisten• println metoden kalder automatisk toString metoden

(medmindre argumentet allerede er af typen String)

String toString(){…}

Klassenavn ID-nr (hexa-decimal værdi)

Ingen linjeskift

Page 18: Forelæsning Uge 3 –Mandag - Aarhus Universitet...Forelæsning Uge 3 –Mandag • ArrayList – Collection (samling af objekter) med variabelt antal elementer – Der er mange andre

Pænere udskrift af arrayliste

18

for(Person person : list) {System.out.println(person);

}

• I Person klassen redefineres toString metoden til at returnere noget meningsfyldt (i stedet for klassenavn og hexa-decimalt ID-nr)

public String toString() {return name + " " + age + " years";

}

• Indsætte linjeskift mellem de enkelte objekter i listen

Page 19: Forelæsning Uge 3 –Mandag - Aarhus Universitet...Forelæsning Uge 3 –Mandag • ArrayList – Collection (samling af objekter) med variabelt antal elementer – Der er mange andre

● Java API (Java's klassebibliotek)

19

• Hvis vi vil have mere info om ArrayList klassen kan vi konsultere Java API'en som beskriver grænsefladen til Java's klassebibliotek• Oversigt over alle klasser (og interfaces) i Java Library• API = Application Programming Interface Link

API er en softwaregrænseflade, der tillader et stykke software at interagere med andet software.Et typisk eksempel er at applikationer "taler" med styresystemet for at åbne en fil, hvorefter styresystemet på programmets vegne indlæser filen fra en harddisk eller lignende.I en nøddeskal kan et API betegnes som en måde at tilbyde tjenester, herunder data, fra et system til et andet system.

Page 20: Forelæsning Uge 3 –Mandag - Aarhus Universitet...Forelæsning Uge 3 –Mandag • ArrayList – Collection (samling af objekter) med variabelt antal elementer – Der er mange andre

● Afleveringsopgave: Raflebæger 3 (DieCup 3)

20

• Vi skal endnu en gang arbejde videre med vores Raflebæger• I skal først lave et raflebæger, som kan indeholde et vilkårligt

(positivt) antal terninger (som alle har 6 sider)– For at gøre dette, skal I fastholde (huske) terningerne ved hjælp af en

feltvariabel, der er en arrayliste (som jo kan indeholde et vilkårligt antal)

// skaber raflebæger med n terningerDieCup(int n){…}

DieCup

ArrayList<Die> dies

void roll()int getEyes()

Die

int eyes

void roll()int getEyes()

*

– Derudover skal I ændre konstruktøren for DieCup klasen, så den får en parameter, der angiver antallet af terninger

Page 21: Forelæsning Uge 3 –Mandag - Aarhus Universitet...Forelæsning Uge 3 –Mandag • ArrayList – Collection (samling af objekter) med variabelt antal elementer – Der er mange andre

Raflebæger 3 (DieCup 3) – fortsat

21

• Dernæst skal I lave et raflebæger, som kan indeholde et vilkårligt (positivt) antal terninger, som hver har et vilkårligt antal sider (≥ 2)– Bemærk at vi nu kan have et raflebæger, hvori vi har terninger med

forskellige antal sider– For at håndtere dette, skal I ændre konstruktøren for DieCup klassen, så

antallet af terninger og antallet af deres sider kan specificeres– Dette kan gøres ved hjælp af en arrayliste af heltal

// skaber raflebæger med de specificerede terningerDieCup(ArrayList<Integer> dies){…}

[6,8,5,6]

– Endelig skal I tilpasse metoderne i TestDriver klassen, således at de kan anvendes til raflebægre af ovenstående slags

Page 22: Forelæsning Uge 3 –Mandag - Aarhus Universitet...Forelæsning Uge 3 –Mandag • ArrayList – Collection (samling af objekter) med variabelt antal elementer – Der er mange andre

● Opsummering• ArrayList (eksempel på en Collection type)

– Kan bruges til at realisere én-til-mange relationer– Har et variabelt (ubegrænset) antal elementer

• MusicOrganizer projektet– Eksempel på brug af ArrayList

• Javas for-each løkke– Alternativ til den almindelige for løkke– Velgenet til gennemløb af arraylister (og andre collections)

• Java API (grænsefladen til Javas klassebibliotek)

• Afleveringsopgave: Raflebæger 3 (DieCup 3)

22

for(Person person : persons) {...}

Page 23: Forelæsning Uge 3 –Mandag - Aarhus Universitet...Forelæsning Uge 3 –Mandag • ArrayList – Collection (samling af objekter) med variabelt antal elementer – Der er mange andre

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

23