Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
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
● 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
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
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
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
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
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
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:
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
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
● 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
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<…>
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)
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
● 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
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)
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
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
● 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.
● 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
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
● 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) {...}
Det var alt for nu….. … spørgsmål
23