TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 5

Relevanta dokument
Övning vecka 5. Denna vecka ska vi titta pa samlingar, generics och designmönstren Decorator, Singleton och Iterator.

Övning vecka 6. public void method2() { //code block C method3(); //code block D }//method2

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 5

Övningen vill visa på vikten av valet av datastruktur, trots att de ofta erbjuder samma funktionalitet genom sina gränssnitt.

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 3

2. Palindrom. Exempel: 1,2,3,2,1 är ett palindrom, och även 0, men inte 1,2,3,1,2,3.

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Övning 5. TDA550 - Objektorienterad programvaruutveckling, fk

Föreläsning 2. Länkad lista och iterator

Föreläsning 2. Länkad lista och iterator

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 1

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Seminarium 3 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

Länkade strukturer. (del 2)

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Stackar, köer, iteratorer och paket

Seminarium 2 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Lösningsförslag: Övning 5.

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista Läsanvisningar och uppgifter

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Jonas Lindgren, Institutionen för Datavetenskap, LiU

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

SI-pass 4. Johan Brook och Jesper Persson. 25 september Diskutera och svara på om påståendena nedan är äkta sanningar eller listiga lögner.

Repetition av OOP- och Javabegrepp

/* * * Lösningsförslag tentamen DIT950 * Datum * */ /* * -1 - */ För samtliga gäller,se föreläsningsanteckningar.

Repetition av OOP- och Javabegrepp

Föreläsning 2 Datastrukturer (DAT037)

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

Tentamen Programmering fortsättningskurs DIT950

Generisk klass med typparameter Inre klass - ListIterator

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Föreläsning 4 Innehåll

Tentamen Objekt-orienterad programmering i Java, 5p distanskurs

BST implementering, huvudstruktur

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

Övning 4. I denna övning ska vi titta på icke-muterbarhet kontra muterbarhet, samt metoderna equals, hashcode och clone.

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Föreläsning 12: Exempel och problemlösning

Objektorienterad Programmering (TDDC77)

Datastrukturer. Arrayer. Arrayer. Arrayer. Array av arrayer. Array av arrayer

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Objektorienterad Programmering (TDDC77)

Laboration A Objektsamlingar

Länkade strukturer, parametriserade typer och undantag

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Att skriva till och läsa från terminalfönstret

Föreläsning 8: Exempel och problemlösning

Föreläsning 3. Stack

Modelsvar för Tentamen för Objektorienterad programvaruutveckling, TDA545

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

! Skall den vara generisk? ! Skall den vara självexpanderande? ! Skall vi ha en speciell klass för listnoder? ! osv

Tentamen Objekt-orienterad programmering med Java, 1DL100 Sommarkurs och distanskurs

DAT043 Objektorienterad Programmering

Föreläsning 3. Stack

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

Vad handlar kursen om? Algoritmer och datastrukturer. Vad handlar kursen om? Vad handlar kursen om?

Listor. Koffman & Wolfgang kapitel 2, avsnitt , och 2.9

Modelsvar för Tentamen för Objektorienterad programvaruutveckling, TDA545

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

Samlingar Collection classes

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 4

Lösningsförslag. Programmeringsmetodik, KV: Java och OOP. 17 januari 2004

Den som bara har en hammare tror att alla problem är spikar

Föreläsning 7. Träd och binära sökträd

Outline. Objektorienterad Programmering (TDDC77) Abstrakta klasser. Abstrakta metoder. Abstrakta klasser. Gränssnitt. Uppräkningar (enum) Ahmed Rezine

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

OOP Objekt-orienterad programmering

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

Objektorienterad Programmering DAT043. Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Konstruktion av klasser med klasser

DAT043 - föreläsning 8

Föreläsning 2 Datastrukturer (DAT037)

Recitation 4. 2-D arrays. Exceptions

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Objektorienterad programmering i Java

Lösningsförslag till tentamen i OOP, HI1027 Fredag 21 oktober 2011

4 13 / %.; 8 </" '': " / //&' " " ' * TelefonKostnad +,-%&. #!" $% " &' . > / ' 5 /' * 13/ &' static Math 1+" &'/ % 12 "" static "' * 1 /") %& &

Föreläsning 1 Datastrukturer (DAT037)

DAT043 - Föreläsning 7

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

Föreläsning 10. ADT:er och datastrukturer

Lycka till! TENTAMEN: Objektorienterade applikationer. Läs detta! 1 (6) Tentamen

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

Parsing med Recursive Descent, Avbildningsklasser. Syntaxdiagram. Syntaxdiagram och kodning expression. Betrakta följande uttryck

Objektorienterad Programkonstruktion. Föreläsning 9 30 nov 2016

Transkript:

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 5 Pelle Evensen & Daniel Wetterbro 20 oktober 2011 Sammanfattning Denna vecka ska vi titta på samlingar, generics och designmönstren Decorator, Singleton och Iterator. Övningarna är graderade (något subjektivt) från lätt ( ) till svår ( ). Svårighetsgraden hos en övning har inte nödvändigtvis med lösningens storlek att göra. 1 Samlingar 1.1 Frekvenstabell Kom ihåg att samlingar och avbildningar (eng. map ) endast kan lagra objektreferenser och inga primitiva värden. Om du försöker lagra primitiva värden, kommer Javakompilatorn automatiskt göra omslagsobjekt (wrapper objects) av motsvarande typer, d.v.s. automatisk typomvandling. (Om du inte är säker på vad omslagsobjekt är för något, diskutera detta med varandra och/eller handledaren). 1 1. Skriv ett program som genererar en frekvenstabell av orden i argumentlistan till programmet. Frekvenstabellen mappar varje ord till antalet gånger det förekommer i argumentlistan. För att förstå vad som egentligen händer, så får ni för närvarande inte använda er av automatisk typomvandling (boxing, unboxing), utan ni måste göra detta explicit. Använd i stället till att börja med följande klassen IncrementableInteger i fig. 1, sida 2, som värden i avbildningen. Histogrammet bör alltså ha den statiska typen Map<String, IncrementableInteger>. 2. Skriv nu samma program utan att använda av IncrementableInteger. Använd automatisk typomvandling så ofta ni kan, d.v.s. programmet ser ut att spara och hämta primitiva värden (förutom deklarationen av avbildningen, som nu får statisk typ Map<String, Integer>). Kan ni se några nackdelar med denna version? 1 Lånad av Bror Bjerner, Övning 4, 2008 1

class IncrementableInteger { private int intfield; public IncrementableInteger(int i) { intfield = i; public void increment() { intfield = intfield + 1; public int getintfield() { return intfield; public String tostring() { return String.valueOf(intField); Figur 1: Klassen IncrementableInteger. 1.2 Iteratorrättning En något meningslös lista över slumpade datum skapas av klassen DummyDates i fig. 2. Den tillhandahåller även en iterator för att stega sig igenom de genererade datumen. 2 Men iteratorn har brister, identifiera dessa! Till din hjälp följer ett utdrag ur Suns Java 6 API: boolean hasnext() Returns true if the iteration has more elements. (In other words, returns true if next would return an element rather than throwing an exception.) E next() Returns the next element in the iteration. Throws NoSuchElementException if the iteration has no more elements. void remove() Removes from the underlying collection the last element returned by the iterator (optional operation). This method can be called only once per call to next. The behavior of an iterator is unspecified if the underlying collection is modified while the iteration is in progress in any way other than by calling this method. Throws UnsupportedOperationException if the remove operation is not supported by this Iterator. Throws IllegalStateException if the next method has not yet been called, or the remove method has already been called after the last call to the next method. 2 Baserad på uppgift av Joachim von Hacht, Övning 4, 2009. 2

public class DummyDates implements Iterable<Date> { private final static int SIZE = 15; private Date[ ] dates = new Date[SIZE]; private int actualsize; public DummyDates() { Random r = new Random(); // Fill the array.... for (int i = 0; i < SIZE; i++) { dates[i] = new Date(r.nextInt()); actualsize = SIZE; public Iterator<Date> iterator() { return new DSIterator(); private class DSIterator implements Iterator<Date> { // Start stepping through the array from the beginning private int next = 0; public boolean hasnext() { // Check if a current element is the last in the array return (next < actualsize); public Date next() { return dates[next++]; public void remove() { for (int i = next; i < SIZE 1; i++) { dates[i] = dates[i + 1]; dates[size 1] = null; actualsize ; Figur 2: Klassen DummyDates. 1.3 En exklusiv union Implementera metoden public static <T> Set<T> exclusiveunion(set<t> s1, Set<T> s2)... som ger den mängd av element som finns antingen i s1 eller s2, men som inte finns i båda. Metoden får inte vara destruktiv, d.v.s. innehållet i s1 och s2 får inte förändras. I metodkroppen använder ni bara mängdoperationer och konstruktorer för mängder. 3 3 Lånad av Bror Bjerner, Övning 4, 2008 3

1.4 Under huven I fig. 3 ses ett enkelt testprogram som lagrar två miljoner slumpmässigt genererade Integers i en samling och därefter söker efter två miljoner ytterligare slumpmässigt framtagna i samlingen. Tre olika implementationer av samlingen har använts: en hashtabell, en trädstruktur och en länkad lista och deras körningstider (i sekunder) uppmätts. För varje datastruktur har vi mätt tiden för add respektive contains (100k tal och 5M tal). Resultaten kan avläsas nedan; avgör när de olika datastrukturerna använts och förklara varför resultaten ser ut som de gör. Vardera av x, y, z motsvarar varsin datastruktur. Är någon konsekvent bättre med avseende på tidsåtgång? Implementation 100k add 100k contains 5M add 5M contains x 0.04 51.00 0.72 > 100 min y 0.13 0.10 8.30 4.80 z 0.06 0.04 2.89 0.96 public class Timings2 { public static void main(string[ ] args) { // Use different implementations of a collection Collection<Integer>[ ] colls = new Collection[3]; colls[0] = new TreeSet<Integer>(); colls[1] = new HashSet<Integer>(); colls[2] = new LinkedList<Integer>(); final int NUMRUNS = Integer.parseInt(args[0]); final int SEED = Integer.parseInt(args[1]); for (Collection<Integer> c : colls) { Random randomizer = new Random(SEED); // Add a lot... long now = System.nanoTime(); for (int i = 0; i < NUMRUNS; i++) { c.add(randomizer.nextint()); System.out.println("add " + c.getclass() + "\t" + ((System.nanoTime() now) / 1000000000.0)); //...and search a lot now = System.nanoTime(); for (int i = 0; i < NUMRUNS; i++) { c.contains(randomizer.nextint()); System.out.println("contains " + c.getclass() + "\t" + ((System.nanoTime() now) / 1000000000.0)); c.clear(); Figur 3: Klassen Timings2. 4

2 Generics 2.1 Typsäkerhet En cykel är ett objekt, likaså är en racingbil en bil är ett objekt. I klassen Vehicles nedan (fig. 4) har programmeraren begått ett fel som gör att programmet krashar vid körning. 1. Varför krashar programmet? 2. Skriv om klassen Vehicles så att felet upptäcks vid kompilering iställt för vid körning. Se gärna Item 23 i [Blo08]. class Bicycle { public String tostring() { return "Two wheeled bike"; class Car { public String tostring() { return "An ordinary car"; public double getco2emissionlevel() { return 0.1; class RaceCar extends Car { public String tostring() { return "Ferrarati 7.4"; public double getco2emissionlevel() { return 5.1; public class Vehicles { public static void main(string[ ] args) { Collection vehicles = new HashSet(); vehicles.add(new Bicycle()); vehicles.add(new Car()); vehicles.add(new RaceCar()); for(object obj : vehicles) { Car c = (Car) obj; System.out.println(c.toString() + " emits " + c.getco2emissionlevel() + " g CO2 / km"); Figur 4: Klassen Vehicles. 3 Singleton-mönstret Syftet med Singleton-mönstret är att vi vill kunna garantera att endast en instans av en klass existerar. Ofta (men inte alltid) bör man också kunna komma åt denna instans utifrån. I fig. 5 visas en klass med enbart klassmetoder. Är detta en singleton? Om inte, hur ska vi förändra den så att den blir det? Spelar det någon roll om den är det eller inte? 5

class GameTile { //... public class GameUtils { public static GameTile[ ][ ] newboard(final int width, final int height, final GameTile basetile) { GameTile[ ][ ] board = new GameTile[width][height]; fillboard(board, basetile); return board; public static void fillboard(final GameTile[ ][ ] board, final GameTile basetile) { for (GameTile[ ] row : board) { for (int j = 0; j < row.length; j++) { row[j] = basetile; Figur 5: Klassen GameUtils. 4 En udda dekoratör och iterator Studera klassen ForwardInputIterator i fig. 6. Som vi ser tar den bort funktionalitet snarare än lägger till. Beskriv syftet med klassen. Om klassen fyller någon sund funktion, hade vi kunnat få samma funktionalitet om vi tänker i termer av Iterator-mönstret istället för hur Javas Iterator-gränssnitt ser ut? Formulera lämpliga eftervillkor för de två metoderna processiterator(iterator<t>) och processiterator(forwardinputiterator<t>). Vad kan gå fel vid det sista anropet till processiterator? Referenser [Blo08] Joshua Bloch. Effective Java. Addison-Wesley, 2nd edition, 2008. 6

public class ForwardInputIterator<T> implements Iterator<T> { private final Iterator<T> it; public ForwardInputIterator(final Iterator<T> it) { this.it = it; @Override public boolean hasnext() { return this.it.hasnext(); @Override public T next() { return this.it.next(); @Override public void remove() { throw new UnsupportedOperationException("remove() not supported."); /** * @post What postcondition can this method guarantee with regards * to the structure that it iterates on? */ public static <T> void processiterator(iterator<t> it) { //... do something interesting here. /** * @post What postcondition can this method guarantee with regards * to the structure that it iterates on? */ public static <T> void processiterator(forwardinputiterator<t> it) { //... do something interesting here. public static void main(string[ ] args) { Collection<Object> coll = new LinkedList<Object>(); //... add a lot of elements to coll. // How is this different... processiterator(coll.iterator()); // From this... processiterator(new ForwardInputIterator<Object>(coll.iterator())); // and this... processiterator((iterator<object>) new ForwardInputIterator<Object>(coll.iterator())); Figur 6: Klassen ForwardInputIterator. 7