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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

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

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 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

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

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

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

Recitation 4. 2-D arrays. Exceptions

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

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

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

Länkade strukturer, parametriserade typer och undantag

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

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

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

Generisk klass med typparameter Inre klass - ListIterator

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

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

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

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

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

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

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

Länkade strukturer. (del 2)

Lösningsförslag till tentamen FYTA11 Javaprogrammering

BST implementering, huvudstruktur

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

DAT043 Objektorienterad Programmering

Föreläsning 3. Stack

Föreläsning 2 Datastrukturer (DAT037)

Stackar, köer, iteratorer och paket

Föreläsning 3. Stack

Objektorienterad programmering i Java

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

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

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

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

Föreläsning 4 Innehåll

Tentamen FYTA11 Javaprogrammering

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

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

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

Föreläsning 14. Filhantering

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

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

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

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Laboration A Objektsamlingar

Kurskod SMD135 (SMD064) Datum Skrivtid 4 tim

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

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Tentamen Objekt-orienterad programmering i Java, 5p distanskurs

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.

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

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Tentamen Programmering fortsättningskurs DIT950

LULEÅ TEKNISKA UNIVERSITET

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

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

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

Objektorienterad Programmering (TDDC77)

Programmering för språkteknologer II, HT2014. Rum

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

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

Algoritmer. Två gränssnitt

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

DAT043 - föreläsning 8

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

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

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

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

Kapitel 6. Hakparenteser fšr att ange index MŒnga všrden av samma typ

Objektsamlingar i Java

Objektorienterad programmering E. Algoritmer. Telefonboken, påminnelse (och litet tillägg), 1. Telefonboken, påminnelse (och litet tillägg), 2

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Arrayer. results

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

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

Tentamen LÖSNINGSFÖRSLAG. c) Tilldelningen C x = new D() ger kompileringsfel eftersom klassen D är abstrakt.

Del A (obligatorisk för alla)

Transkript:

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 5 Daniel Wetterbro 23 november 2009 Sammanfattning Denna vecka ska vi titta på I/O, samlingar och generics. Ö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

1 I/O 1.1 Heltalsförflyttning I den här uppgiften ska heltal (int) läsas från tangentbordet och lagras i en Vector<T>. Därefter ska alla heltal i vectorn skrivas till dels en binär fil och dels en textfil. I den binära filen kan talen lagras efter varandra eftersom en int alltid upptar fyra byte. I textfilen avskiljs varje tal genom att ligga på en egen rad. De båda filnamnen ska ges som argument till programmet på kommandoraden. Programmet kan t.ex. köras genom att skriva: java IntegerTransfer intsbin ints.txt I fig. 1 finns ett skelett till klassen IntegerTransfer att fylla i kod där... angetts. public class IntegerTransfer { private static final int ERROR ARGS = 1; private static final int ERROR FILES = 2; public static void readintegers(...) throws Exception {... public static void writeintegers(...) throws Exception {... public static void main(string[ ] args) { // Check number of arguments if (args.length < 2) { System.out.println("Too few arguments" + "\nusage IntegerTransfer <binary output file> " + "\n<text output file>"); System.exit(ERROR ARGS); // Create storage... // Read and write numbers try { readintegers(numstorage); writeintegers(numstorage, args[0], args[1]); catch (Exception e) { System.err.println(e.getCause().getMessage()); System.exit(ERROR FILES); Figur 1: Klassen IntegerTransfer. 2

2 Samlingar 2.1 Frekvenstabell Kom ihåg att samlingar och mappar endast kan lagra objektreferenser och inga primitiva värden. Om du försöker lagra primitiva värden, så skulle Java 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. Därför, använd i stället till att börja med följande klassen IncrementableInteger i fig. 2 som värden i mappen: 2. Skriv nu samma program utan användning 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 mappen). Kan ni se några nackdelar med denna version? 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 2: Klassen IncrementableInteger. 1 Lånad av Bror Bjerner, Övning 4, 2008 3

2.2 Iteratorrättning En något meningslös lista över slumpade datum skapas av klassen DummyDates i fig. 3. 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. 4

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 3: Klassen DummyDates. 5

2.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 2.4 Under huven I fig. 4 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 uppmätts. Det har dessutom gjorts två olika typer av körningar, en där endast talen lades till i datastrukturerna (med add-metoden) och en där hela koden i fig. 4 kördes (add och contains). 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. Endast körning av add-metoden 1. 1,304s 2. 3,859s 3. 6,024s Körning av både add- och contains-metoderna 1. 4,943s 2. 10,507s 3. > 7min 3 Lånad av Bror Bjerner, Övning 4, 2008 6

public class Timings { private static final int NUMRUNS = 2000000; public static void main(string[ ] args) { // Use different implementations of a collection Collection<Integer> c = new TreeSet<Integer>(); // new LinkedList<Integer>(); // new HashSet<Integer>(); // Add a lot... Random randomizer = new Random(); for (int i=0; i<numruns; i++) { c.add(randomizer.nextint()); // First run does not include code below //...and search for a lot for (int i=0; i<numruns; i++) { c.contains(randomizer.nextint()); Figur 4: Klassen Timings. 7

3 Generics 3.1 Vilken macka passar i påsen? En ostmacka är en macka, och en sillmacka är en macka. Men för att kunna lägga båda i en påse vill vi skapa en generisk klass FoodBag<T>. 4 1. Fundera över vilka av satserna i main-metoden i fig. 5 som kommer fungera och vilka som genererar ett kompileringsfel eller bara en varning (ytterligare information kan fås i [Blo08]). 2. Skriv innehållet i klassen FoodBag<T>. Den ska bara innehålla en instansvariabel av den parametriserade typen och tillhörande accessor- och mutatormetoder. class Sandwich { public String tostring() { return "Nothing but a sandwich"; class HerringSandwich extends Sandwich { public String tostring() { return "Herr sandwich"; class CheeseSandwich extends Sandwich { public String tostring() { return "Cheesy sandwich"; class FoodBag<T> { public class SandwichTest { public static void main(string[ ] args) { FoodBag<Sandwich> bag1 = new FoodBag<HerringSandwich>(); FoodBag<?> bag2 = new FoodBag<CheeseSandwich>(); bag2.setfood(new CheeseSandwich()); FoodBag<HerringSandwich> bag3 = new FoodBag<Sandwich>(); FoodBag bag4 = new FoodBag(); bag4.setfood(new CheeseSandwich()); Figur 5: Klassen SandwichTest. 4 Lånad av Joachim von Hacht, Övning 5, 2009 (svagt modifierad). 8

Referenser [Blo08] Joshua Bloch. Effective Java. Addison-Wesley, 2nd edition, 2008. 9