Generiska klasser och funktioner

Relevanta dokument
Generiska klasser och funktioner

Uno Holmer, Chalmers, :17 Uno Holmer, Chalmers, :17

Objektsamlingar i Java

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

Objektorienterad programmering D2

Länkade listor och automatisk testning

OBJEKTORIENTERAD PROGRAMMERING för Z1 (TDA540)

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

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

DAT043 Objektorienterad Programmering

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

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

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

DAT043 - föreläsning 8

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

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

Kopiering av objekt i Java

Objektinteraktion. Objektorienterad programmering Laboration 2. Syfte Att konstruera ett litet objektorienterat program med flera samverkande objekt.

Repetition av OOP- och Javabegrepp

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

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

Repetition av OOP- och Javabegrepp

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

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

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

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel

Användning av datastrukturer Algoritmer och datastrukturer Obligatorisk Laboration nr 1

Subtyping och variance. Objekt-orienterad programmering och design Alex Gerdes, 2018

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

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

Föreläsning 3-4 Innehåll

Dugga Datastrukturer (DAT036)

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

Lambdas. (och fler design patterns) Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

Föreläsning 3. Stack

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

Objektorienterad programmering Föreläsning 10. Copyright Mahmud Al Hakim Sorteringsalgoritmer

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Föreläsning REPETITION & EXTENTA

Tentamen OOP

Föreläsning 12. Länkade listor

Typkonvertering. Java versus C

Tentamen i Algoritmer & Datastrukturer i Java

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

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

OOP Objekt-orienterad programmering

CHALMERS TENTAMEN. 2018/2019, lp 1 DAT050. Uno Holmer

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

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

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

Rekursiva funktioner Algoritmer och datastrukturer Obligatorisk Laboration nr 5

Föreläsning 4 Innehåll

Tentamen Datastrukturer, DAT037 (DAT036)

TENTAMEN: Objektorienterad programmering. Läs detta! Skriv din tentamenskod på varje blad (så att vi inte slarvar bort dem).

Programmering A. Johan Eliasson

Arv och polymorfism i Java

Static vs Dynamic binding Override vs Overload. Objekt-orienterad programmering och design Alex Gerdes och Sólrún Halla Einarsdóttir, 2018

Kungl. Tekn. Högskolan Förel 1, bild 1 Föreläsning 1: Introduktion ffl Kursinnehåll ffl Javarepetition ffl Referenser ffl Nyckelordet static ffl Klass

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

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

Objektorienterad Programmering (TDDC77)

Generiska konstruktioner. Kursbokens kapitel 13

Del A (obligatorisk för alla)

Subtyping, co- och contra-variance. Objekt-orienterad programmering och design Alex Gerdes, 2016

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

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

Föreläsning 5-6 Innehåll

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

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

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

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

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

Länkade strukturer. (del 2)

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Föreläsning 3. Stack

Objektinteraktion. Objektorienterad programmering Laboration 2. Syfte Att konstruera ett litet objektorienterat program med flera samverkande objekt.

Tentamen. DD2385 Programutvecklingsteknik vt 2014 Måndagen den 2 juni 2014 kl Hjälpmedel: penna, suddgummi, linjal

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

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

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Laboration A Objektsamlingar

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

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Samlingar, Gränssitt och Programkonstruktion! Förelasning 11!! TDA540 Objektorienterad Programmering!

Tentamen i Programmering

Datalogi I, grundkurs med Java 10p, 2D4112, Tentamen 29 november 2003, svar och lösningar

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

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

Användning av datastrukturer Algoritmer och datastrukturer Obligatorisk Laboration nr 1

Generiska typer. Java 5.0: Säkrare, snyggare, smidigare. Viktigaste utökningarna av språket: Autoboxing/unboxing, bakgrund.

Objektorienterad programmering E. Telefonboken, än en gång. Gränssnitt. Telefonboken med gränssnitt specificerat, del 1.

Sammansatta datatyper Generics: Parametrisk polymorfism

Transkript:

1 (6) Generiska klasser och funktioner Algoritmer och datastrukturer Obligatorisk nr 2 Syfte Att ge träning i definition av generiska klasser och funktioner i Java. Problemen som belyses är viktiga att förstå i allmänhet, och för resten av kursen i synnerhet. Övningen kräver ej avancerade typuttryck med wild-cards och liknande men det rekommenderas ändå att studera dessa eftersom de dyker upp senare i kursen. Föreläsning 3 sammanfattar det viktigaste om generiska typuttryck. Ett exempel på en generisk mängdklass finns i OH från föreläsning 1, sid. 20-. Litteratur Weiss: 4.6-8 Litt. Weiss 4.7, Skansholm 17.1. OH-kopior från föreläsningarna 1 (s. 20-), 2 (s. 22-) om standardklasserna i Java, samt 3 om generiska klasser. Färdig programkod Given programkod som behövs i uppgifterna finns på kurshemsidan under fliken er. Genomförande och redovisning Uppgifterna är obligatoriska. Redovisning sker i grupper om två personer inte färre, inte fler. Varje grupp skall självständigt utarbeta sin egen lösning. Samarbete mellan grupperna om övergripande principer är tillåtet, men inte plagiering. Gå till kurshemsidan och vidare till er->hur man använder Fire-systemet. Om du inte registrerat labbgrupp i Fire än: Gör laboration 0.0 innan du fortsätter! Redovisa filerna SingleBuffer.java, TestSingleBuffer.java, CollectionOps.java samt Main.java. med dina lösningar, samt README.txt med allmänna kommentarer om lösningen. Andra halvan av Redovisningsproceduren beskriver hur du postar materialet i Fire. Senaste redovisningsdag, se Fire.

2 (6) Uppgift 1 En generisk enplatsbuffert TestSingleBuffer.java Klassen SingleBuffer har metoderna put och get och kan lagra ett dataelement. Operationen put sätter in ett nytt dataelement i en tom buffert, och get tar bort och returnerar innehållet i en full buffert. Metoden put returnerar ett booleskt returvärde som indikerar om operationen lyckades eller ej; put misslyckas om bufferten är full, och get om den är tom och i så fall returerar get null, annars det borttagna elementet. Initialt är en buffert tom. Klassen skall vara generisk med avseende på det lagrade dataelementet. Definiera klassen! Exempel: SingleBuffer<Integer> b = new SingleBuffer<Integer>(); Integer x,y; boolean result; result = b.put(123); // result == true result = b.put(456); // result == false x = b.get(); // x == 123 result = b.put(456); // result == true x = b.get(); // x == 456 y = b.get(); // y == null (bufferten var tom) Uppgift 2 En egen generisk utskriftsmetod CollectionOps.java,Main.java Litt. Weiss 4.7.3, Skansholm 17.1.2 Skriv en generisk (statisk) klassmetod print som skriver ut elementen i en objektsamling: public static <T> void print(collection<t> l) Om samlingen innehåller elementen a, b och c så skall utskriften ha formen [a,b,c] och [] om samlingen är tom. Placera metoden i klassen CollectionOps och skriv testfall för den i Main. Du får anta att samlingens elementtyp har en tostring-metod, men inte att hela samlingen har en sådan. Studera först typen java.util.collection i Java API. Tips: Samlingar är itererbara. Uppgift 3 En generisk metod som vänder en lista CollectionOps.java,Main.java Litt. Weiss 4.7.3, Skansholm 17.1.2 Skriv en generisk klassmetod som vänder elementen i en lista: public static <T> List<T> reverse(list<t> l) Exempel: Givet följande tre listor, med innehåll inom parentes List<Integer> heltal [1, 2, 3, 4, 5] List<Double> flyttal [1.25, 3.14, 9.7] List<String> campuslindholmen ["Saga", "Svea", "Jupiter"] så skall metodanropen CollectionOps.print(CollectionOps.reverse(heltal)); CollectionOps.print(CollectionOps.reverse(flyttal)); CollectionOps.print(CollectionOps.reverse(campusLindholmen)); resultera i att listornas innehåll förändras till [5,4,3,2,1], [9.7,3.14,1.25], resp. [ Jupiter, Svea, Saga ], ingen ny lista skall skapas, men en referens till den förändrade listan skall returneras, så att man t.ex. kan anropa metoden som ovan. Algoritmen får ej skapa temporära listor, enkla variabler räcker. Tips: En viss metod som presenterades i den tredje föreläsningen kan visa sig användbar i lösningen.

3 (6) Uppgift 4 En generisk metod som jämför två samlingar CollectionOps.java, Main.java Litt. Weiss 4.7.3, Skansholm 17.1.2 Skriv en generisk klassmetod som avgör om alla elementen i en samling är strikt mindre än (<) alla elementen i en annan samling. Alla jämförelser skall göras med ett komparatorobjekt som skickas med som parameter (jfr uppgift 2 i lab 1, samt förel. 1). public static <T> boolean less(collection<t> c1, Collection<T> c2, Comparator<T> comp) Exempel: Givet följande komparatorobjekt och listor, med listornas innehåll inom parentes IntegerComparator intcomp = new IntegerComparator(); StringComparator stringcomp = new StringComparator(); List<Integer> li1 [4,2,5,1,3] List<Integer> li2 [8,6,7,9] List<Integer> li3 [97,5,123,18] List<String> johanneberg ["HC2", "ED", "HC3"] List<String> lindholmen ["Saga", "Svea", "Jupiter"] så skall anropen CollectionOps.less(li1,li2,intcomp); CollectionOps.less(li1,li3,intcomp); CollectionOps.less(johanneberg,lindholmen,stringcomp); Returnera true, false, resp. true. Definiera först IntegerComparator enligt samma mönster som StringComparator (se förel. 2). Tips: I standardklassen java.util.collections finns ett par metoder som kan göra din lösning till en enradare.

4 (6) Högre ordningens funktioner Inom området funktionell programmering används s.k. högre ordningens funktioner. Sådana funktioner kan ta andra funktioner som parametrar och även ge funktioner som resultat. Man kan simulera något liknande i C med hjälp av funktionspekare, och i java med speciella objekt, s.k. funktorer eller funktionsobjekt. En högre ordningens funktion som brukar finnas i funktionella programspråk som ML eller Haskell, är map som applicerar en annan funktion på alla elementen i en lista. Översatt till pseudojava skulle det t.ex. kunna se ut så här: Integer sign(double x) { if ( x > 0.0d ) return 1; else if ( x == 0.0 ) return 0; else return -1; List<Double> l1 = new ArrayList<Double>(); // addera talen 23.4, -19.0, 377.62, 0.0, 18.9, -32.12 till l1... List<Integer>l2 = map(sign,l1); print(l2); // [1,-1,1,0,1,-1] Ovanstående syntax är dock ej möjlig i Java, men man kan göra något liknande. Först definierar vi ett generiskt gränssnitt för unära operatorer, d.v.s. operatorer (funktioner) som tar ett argument public interface UnaryOp<T1,T2> { T2 op(t1 x); Vi använder två typvariabler för att göra op så generell som möjligt. Den kan då returnera ett värde av en annan typ (T2) än argumentets typ (T1). Nu låter vi klassen SignFunctor implementera UnaryOp: public class SignFunctor implements UnaryOp<Double,Integer> { public Integer op(double x) { return x.compareto(0.0d); Den generiska klassmetoden map kan nu definieras public static <T1,T2> List<T2> map(unaryop<t1,t2> functor,list<t1> l) { List<T2> result = new ArrayList<T2>(l.size()); // Copy the elements and apply op to them for ( T1 x : l ) result.add(functor.op(x)); return result; Metoden fungerar, men det finns nackdelar: För att göra den generell använder vi List som parameter- och resultattyp, men returvärdet konstrueras med en ArrayList. Om metoden anropas med en annan listtyp som argument förväntar sig troligen användaren ett returvärde av samma typ. Dessutom vill vi göra metoden mer generell så att den kan hantera alla samlingar av typen Collection, inte bara listor. Vi kan utnyttja javas möjligheter för att hantera dynamisk typinformation på följande sätt:

5 (6) public static <T1,T2> Collection<T2> map(unaryop<t1,t2> functor,collection<t1> c) { // Determine the dynamic type of the collection // so the same kind can be returned Class<? extends Collection> cls = c.getclass(); try { // Create a result object of the same dynamic type as c Collection<T2> result = cls.newinstance(); // Copy the elements and apply op to them for ( T1 x : c ) result.add(functor.op(x)); return result; catch (Exception e) { e.printstacktrace(); return null; Nu kan vi skriva om de två sista raderna i pseudokoden ovan till typkorrekt fungerande javakod: Collection<Integer> l2 = CollectionOps.map(new SignFunctor(),l1); CollectionOps.print(l2); Uppgift 5 En generisk filtermetod CollectionOps.java, Main.java Med ledning av ovanstående exempel med map är nu uppgiften att på analogt sätt konstruera en generisk filtermetod. Filter tar ett predikat (en boolesk funktion med en parameter) samt en samling som parametrar och returnerar en ny samling med alla element som uppfyller predikatet. Ett exempel i pseudokod: boolean iseven(integer x) { return x % 2 == 0; List<Integer> l1 = new ArrayList<Integer>(); // lägg in talen 3, -42, 88, 19, -37, 0, 18 i listan... List<Integer>l2 = filter(iseven,l1); print(l2); // [-42,88,0,18] Först definierar vi det generiska gränssnittet public interface UnaryPred<T> { boolean pred(t x); Definiera nu klassen IsEvenFunctor i Java så att den implementerar UnaryPred, och därefter den generiska klassmetoden filter. Filter blir ganska lik slutversionen av map. Tänk först efter vilka typvariabler den bör ha. Placera filter i CollectionOps. Skriv testkod i Main! Hitta gärna på ytterligare liknande exempel! Klassen CollectionOps skall alltså innehålla följande metoder när allt är klart:

6 (6) public class CollectionOps { public static <T> void print(collection<t> l) {... public static <T> List<T> reverse(list<t> l) {... public static <T> boolean less(collection<t> c1, Collection<T> c2, Comparator<T> comp) {... // given public static <T1,T2> Collection<T2> map(unaryop<t1,t2> functor,collection<t1> l) {...... // define filter! Definiera lämpliga testfall!