Föreläsning 4, Kapitel 4 Gruppera objekt Kursbok: “Objects First with Java - A Practical Introduction using BlueJ”, David J. Barnes & Michael Kölling Replace this with your course title and your name/contact details. Fredric Ragnar fredric.ragnar@hgo.se Telefon 0498-299948 Andreas Hedrén andreas.hedren@hgo.se Telefon 0498-299954
Idag Det handlar om samlingar av likadana objekt. Vi tar upp: Collections eller samlingar Loopar Iteratorer Arrayer
Varför skall vi ha massa likadana objekt? Behov av att hantera många likadana finns i många applikationer: Bibliotekskataloger Studentregister Antalet element eller poster som skall lagras varierar: Element läggs till Element tas bort
En personlig anteckningsbok Det går att spara anteckningar Det går att läsa enskilda anteckningar Det finns ingen begränsning på antalet anteckningar Den skall tala om hur många anteckningar som är sparade Utforska projektet: notebook1
Bibliotek av klasser Samlingar med användbara klasser Vi behöver inte skriva allt från början Java kallar sina bibliotek, packages Att kunna gruppera objekt är ett vanligt och återkommande behov: Paketet java.util innehåller klasser för detta
En första ansats till en anteckningsbok import java.util.ArrayList; /** * ... */ public class Notebook { // Storage for an arbitrary number of notes. private ArrayList<String> notes; * Perform any initialization required for the * notebook. public Notebook() notes = new ArrayList<String>(); } ...
Objektdiagram med två sparade anteckningar
Objektdiagram med en tredje anteckning
Egenskaper hos en samling Den ökar sin kapacitet efter behov Den har en privat räknare (size()-metod) Ordningen bland objekten ändras inte Detaljerna för hur allt går till är dolda Spelar det någon roll? Hindrar det oss att använda samlingen om vi inte vet hur?
Att använda en samling public class Notebook { private ArrayList<String> notes; ... public void storeNote(String note) notes.add(note); } public int numberOfNotes() return notes.size(); Lägga till en ny anteckning. Returnera antalet anteckningar (delegation).
Numrering med index
Att hämta ett objekt Kontroll att index är OK public void showNote(int noteNumber) { if(noteNumber < 0) { // This is not a valid note number. } else if(noteNumber < numberOfNotes()) { System.out.println(notes.get(noteNumber)); else { Hämta och skriv ut anteckningen
Att ta bort objekt kan påverka numreringen
Summering samlingar Samlingar (Collections) kan lagra ett valfritt antal objekt Klassbibliotek har ofta väl testade samlings-klasser Java kallar sina klassbibliotek för eller paket (eng: packages ) Vi har använt klassen ArrayList från java.util paketet
Summering samlingar, mera Element kan läggas till och tas bort Varje element har ett index Viket index ett element har kan ändras om andra element läggs till eller tas bort De huvudsakliga metoderna för klassen ArrayList är add, get, remove och size.
Iteration Vi vill ofta göra saker ett godtyckligt antal gånger. T ex skriva ut alla anteckningar. Hur många anteckningar finns det? De flesta programmeringsspråk har loop-satser som man har till just detta Java har tre sorters loop-satser Vi tittar mest på while-loopen
Iteration, flödesdiagram while-loop Villkor A Falskt Sant Iteration med while-loop: A utföres (upprepade gånger) så länge som {villkor} är sant ”Så länge som”, ”while” på engelska
Iteration, flödesdiagram, exempel Sant Törstig? Drick en klunk vatten Falskt Iteration: ”Drick en klunk vatten” utförs (och upprepas) så länge som {Törstig?} är sant
Pseudokod för while-loopen Generell while-loop while nyckelord Boolskt test while(loop villkor) { loop kropp } Satser som skall upprepas Pseudo-kod exampel för att skriva ut varje anteckning while(det finns minst en anteckning till att skriva ut) { skriv ut nästa anteckning }
While-loop: kod vs flödesdiagram /** * List all notes in the notebook. */ public void listNotes() { int index = 0; while(index < notes.size()) { System.out.println(notes.get(index)); index++; } Sant index < notes.sice() System.out.println(notes.get(index)); index++; Falskt
Iterera över alla objekt i en samling Returnerar ett Iterator objekt java.util.Iterator Iterator it = myCollection.iterator(); while(it.hasNext()) { call it.next() to get the next object do something with that object } public void listNotes() { Iterator it = notes.iterator(); while(it.hasNext()) { System.out.println(it.next()); }
Auktionsprojektet Projektet auction ger exempel på hur man kan använda samlingar och iteration på flera sätt. Två saker till att ta upp: Värdet null Casting. Används för att spara resultatet av get i en variabel. String message = (String) notes.get(0);
Summering loopar Loop-satser gör det möjligt att repetera ett block med satser En while-sats i Java låter ett boolskt uttryck styra repetitionen Samlingsklasser har speciella Iterator objekt som förenklar iterationen över hela samlingen.
Samlingar med fix storlek Ibland vet man hur många objket en samling skall ha. Programmeringsspråk har oftast en speciell samlingstyp för smalingar med fast storlek: array Arrayer i Java kan lagra primitiva datatyper eller objekt Arrayer har en speciell syntax
Projektet weblog-analyzer Webservrar lagrar information om varje åtkomst Stöttar webmastern i dennes uppgifter Populäraste sidorna Vilka tider är belastningen högst Hur mycket data skickas Referenser som inte fungerar Analysera åtkomster per timme
Att skapa ett array-objekt public class LogAnalyzer { private int[] hourCounts; private LogfileReader reader; public LogAnalyzer() hourCounts = new int[24]; reader = new LogfileReader(); } ... Deklaration av arrayvariabel Skapa ett arrayobjekt
Arrayen hourCounts
Att använda en array Hakparantes-notation används för att komma åt ett element i arrayen: hourCounts[...] Elementen används som vanliga variabler: På vänster sida i en tilldelning: hourCounts[hour] = ...; I uttryck: adjusted = hourCounts[hour] – 3; hourCounts[hour]++;
For-loopen Liknar while-loopen Används ofta för att iterera ett fixt antal gånger Används ofta för att iterera över en array
Iteration med for-loop A utförs först en enda gång (upprepade gånger): Är {villkor} sant så utförs B och sedan C C Sant Villkor B Falskt
For-loopens pseudokod Generella formen för for-loop for(initiering; villkor; åtgärd efter kroppen) { satser som skall repeteras } Samma sak i formen av en while-loop initiering; while(villkor) { satser som skall repeteras åtgärd efter kroppen }
for-loop: källkod vs flödesdiagram int hour = 0 for(int hour = 0; hour < hourCounts.length; hour++) { System.out.println(hour + ": " + hourCounts[hour]); } hour++; Sant hour < hourCount.length() System.out. println( hour + ": " + hourCounts [hour]); Falskt
Version med while-loop Ett exempel i Java Version med for-loop for(int hour = 0; hour < hourCounts.length; hour++) { System.out.println(hour + ": " + hourCounts[hour]); } Version med while-loop int hour = 0; while(hour < hourCounts.length) { System.out.println(hour + ": " + hourCounts[hour]); hour++; }
Summering arrayer Arrayer är bra när man behöver en samling där antalet objekt inte ändras. Arrayer har en speciell syntax. For-loopar är ett alternativ till while-loopar när man vet hur många repetetioner man skall göra. For-loopar används ofta för att iterera över elementen i arrayer.