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

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

Föreläsning 2 Innehåll

Java Collections Framework. Föreläsning 2 Innehåll. Java Collections Framework interface hierarki. Java Collections Framework interface hierarki

Föreläsning 1-2. Språkkonstruktioner i Java. Introduktion till delar av Javas klassbibliotek

Java Collections Framework. Föreläsning 2 Innehåll. Java Collections Framework interface hierarki. Java Collections Framework interface hierarki

Föreläsning 2 Innehåll

Föreläsning 2 Innehåll. Generiska klasser. Generik i Java. Varför generiska klasser Bakgrund

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

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

Föreläsning 9 Innehåll

Interfacen Set och Map, hashtabeller

Föreläsning 4 Innehåll

Föreläsning 1-2 Innehåll. EDAA01 Programmeringsteknik - fördjupningskurs. Detta kan du... Förkunskaper

EDAA01 Programmeringsteknik - fördjupningskurs

Begreppet subtyp/supertyp i Java. Mera om generik. Generik och arv. Generik och arv. Innehåll

Länkade strukturer. (del 2)

DAT043 - föreläsning 8

Föreläsning 3-4 Innehåll

Föreläsning 1-2 Innehåll. EDAA01 Programmeringsteknik - fördjupningskurs. Detta kan du... Förkunskaper

Föreläsning 10 Innehåll

Föreläsning 10 Innehåll. Diskutera. Hashtabeller. Hashfunktion. hashfunktion. hashkod (ett heltal)

Diskutera. Hashfunktion

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

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

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

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Inlämningsuppgift och handledning

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

Samlingar Collection classes

Inlämningsuppgift och handledning. Föreläsning 11 Innehåll. Diskutera. Hashtabeller

Repetition av OOP- och Javabegrepp

Föreläsning 11 Innehåll

Repetition av OOP- och Javabegrepp

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

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

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

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

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

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

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

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

Föreläsning 3 Innehåll

Diskutera Sortera objekt

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

Föreläsning 14 Innehåll

Samlingar Collection classes

Arrayer. results

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

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

Föreläsning 10 Innehåll. Diskutera. Inordertraversering av binära sökträd. Binära sökträd Definition

Föreläsning 11 Innehåll. Diskutera. Binära sökträd Definition. Inordertraversering av binära sökträd

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

Hitta k största bland n element. Föreläsning 13 Innehåll. Histogramproblemet

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

Föreläsning 10 Innehåll

Objektorienterad programmering med Java, Generics

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

Stackar, köer, iteratorer och paket

Föreläsning 9. Generiska enheter Inre klasser Anonyma klasser Kloning

Lösningsförslag till tentamen i EDAA01 programmeringsteknik fördjupningkurs

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

Programmering fortsättningskurs

Collection classes. Interface, första exempel. Interface (forts) Men först

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

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

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

Föreläsning Innehåll. Hantera många element. Exempel: polygon Godtyckligt antal element. Exempel: polygon forts

Tentamen Objekt-orienterad programmering i Java, 5p distanskurs

Saker du ska kunna Föreläsning 13 & 14

Generiska datatyper. Parametrisk Polymorfism: Generics. Generisk lista. Utvikning: Typer

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

Föreläsning 1. Abstrakta datatyper, listor och effektivitet

Föreläsning 2 Datastrukturer (DAT037)

Länkade strukturer, parametriserade typer och undantag

Sammansatta datatyper Generics: Parametrisk polymorfism

Generisk klass med typparameter Inre klass - ListIterator

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

TDDC77 Objektorienterad Programmering

DAT043 Objektorienterad Programmering

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

Collection Classes. bjectorienterad programmering Sida 1

Föreläsning 3. Stack

Generiska konstruktioner. Kursbokens kapitel 13

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

Mera om generik. Innehåll. Generik och arv Wildcards Vektorer och generik Generiska metoder. EDA690 (Mera om generik) HT / 24

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, 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 Läsanvisningar och uppgifter

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

Objektorienterad Programmering (TDDC77)

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

Föreläsning 12. Länkade listor

Seminarieövningar, Algoritmer och datastrukturer

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

Programmeringsteknik - fördjupningskurs

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Lösningsförslag till tentamen i EDA690 Algoritmer och Datastrukturer, Helsingborg

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

Transkript:

Seminarium 3 Introduktion till Java Collections Framework Innehåll Generik Bakgrund Java Collections Framework interface och klasser för samlingar av element interfacen Iterator och Iterable och foreach-sats i Java - används för att traversera genom en samling element Jämföra objekt metoden equals, interfacet Comparable Efter detta seminarium ska ni kunna lösa uppgifterna i kapitel 3 i övningshäftet. Typosäkerhet utan generik! I den gamla modellen kunde man skriva: mylist.add(new Integer(1)); mylist.add(new Integer(2)); mylist.add(new Person( Kalle )); Om avsikten är att listan ska innehålla tal, har vi gjort fel på rad 3. Kompilatorn kan inte upptäcka detta koden är korrekt, både Integer och Person är subklasser till Object. PFK (Seminarium 2 JCF) HT 2015 1 / 35 Generik i Java PFK (Seminarium 2 JCF) HT 2015 2 / 35 Exempel på en generisk klass java.util.arraylist Kompilatorn kommer att upptäcka typfel. Ex: ArrayList<Integer> mylist = new ArrayList<Integer>(); mylist.add(new Person("Kalle")); ger nu kompileringsfel, mylist får enligt sin deklaration endast innehålla objekt av typen Integer. Utdrag ur den generiska klassen java.util.arraylist: public class ArrayList<E> { public ArrayList() { public boolean add(e x) { public void add(int index, E x) { public E get(int index) { Alla add-metoder har inparameter av typen E. Därför kan enbart objekt av klassen E (eller subklasser till denna) sättas in i listan. PFK (Seminarium 2 JCF) HT 2015 3 / 35 PFK (Seminarium 2 JCF) HT 2015 4 / 35

Implementering av generisk klass Generisk klass med flera typparametrar Implementering Java 1.4 public class Container { private Object item; public Container(Object x) { item = x; public Object get() { return item; Fr o m Java 5.0 generisk klass public class Container<E> { private E item; public Container(E x) { item = x; public E getitem() { return item; public class Pair<K, V> { private K key; private V value; public Pair(K key, V value) { this.key = key; this.value = value; public V getvalue() { return value; public void set(object x) { item = x; public void setitem(e x) { item = x; public void setvalue(v val) { value = val; PFK (Seminarium 2 JCF) HT 2015 5 / 35 Generisk klass med flera typparametrar Användning PFK (Seminarium 2 JCF) HT 2015 6 / 35 Generiska interface Även interface kan vara generiska. Ex: Exempel: Pair<String, Integer> pair = new Pair<String, Integer>("June", 30); int nbrdays = pair.getvalue(); public interface Set<E> { boolean add(e x); int size(); boolean contains(object x); PFK (Seminarium 2 JCF) HT 2015 7 / 35 PFK (Seminarium 2 JCF) HT 2015 8 / 35

Generik syntax Deklaration av parametriserade (generiska) klasser/interface: public class Set<E> { public interface Comparable<T> public class Pair<K,V> Klassen/interfacet har en parameterlista som omges av tecknen < och >. En parameter namnges med en typvariabel (markeras ovan) som kan vara en godtycklig identifierare. Om det är flera parametrar används komma som skiljetecken. PFK (Seminarium 2 JCF) HT 2015 9 / 35 Restriktioner för typparametrar och typvariabler Generik syntax I generiska klasser/interface kan typparametrarna användas för att deklarera attribut, variabler, Ex: public class Container<E> { private E item; public Container(E x){ this.item = x; public E getitem()){ return item; Man kallar ofta E för typvariabel när den används så här. PFK (Seminarium 2 JCF) HT 2015 10 / 35 Typparametrar med begränsningar Parameter till generisk klass kan inte vara primitiv typ: SomeClass<int> c = // Går inte! Typvariabler kan inte användas för att skapa objekt: public class SomeClass<E> { public void p() { E x = new E(); // Fel! Typparametrar kan inte användas för att överlagra metoder: public class MyClass<T,U> { public void p(t x) { public void p(u x) { // Fel! Ibland behöver man ange begränsning på typparmetern: public class ASortedCollection<E extends Comparable<E>> <E extends T> betyder: E måste vara subklass till T om T är en klass. Det är också tillåtet att E = T. E måste implementera interfacet T om T är ett interface. I exemplet ovan anger vi alltså att E måste vara en typ som implementerar interfacet Comparable<E>. Vi kan därmed använda metoden compareto på objekt av typen E i implementeringen av ASortedCollection. PFK (Seminarium 2 JCF) HT 2015 11 / 35 PFK (Seminarium 2 JCF) HT 2015 12 / 35

JCF Java Collections Framework JCF interface hierarki Är en hierarki av interface, abstrakta klasser och konkreta klasser för samlingar av element. Finns i paketet java.util. Basen i hierarkin är ett interface Collection: interface Collection<E> { boolean add(e x); boolean contains(object x); boolean remove(object x); boolean isempty(); int size(); interfacen Iterator och Iterable och foreach-sats i Java - används för att traversera genom en samling element PFK (Seminarium 2 JCF) HT 2015 13 / 35 JCF interface hierarki Queue Collection List Set SortedSet Map SortedMap Dokumentation På Javas hemsida (länk finns på kursens hemsida) finns dokumentation av Javas standardklasser. Där finns även tutorials, bl.a. om Javas Collection-klasser. PFK (Seminarium 2 JCF) HT 2015 14 / 35 JCF några klasser Collection en samling av element Queue en samling av element som utgör en kö List en samling element där positionering är möjlig (första, sista, element på plats i, ) Set en samling element där dubbletter är förbjudna SortedSet som Set men med krav att elementen går att jämföra Map en samling av element, där varje element har en en nyckel och ett värde (jfr. lexikon) SortedMap som Map men med krav att nycklarna går att jämföra Interface Queue List Set SortedSet Map SortedMap Implementering LinkedList, PriorityQueue ArrayList, LinkedList HashSet TreeSet HahsMap TreeMap PFK (Seminarium 2 JCF) HT 2015 15 / 35 PFK (Seminarium 2 JCF) HT 2015 16 / 35

Iteratorer Interfacet Iterable<E> Antag att vi lagrar ett antal personer i en lista (eller i någon annan samlingsklass): ArrayList<Person> plist = new ArrayList<Person>(); // här sätts Person-objekt in i samligen Hur ska vi göra för iterera genom samligen och behandla alla personerna (t.ex. skriva ut alla personernas namn)? I Java finns följande interface: public interface Iterable<E> { /** Returns an iterator over a set of elements of type E */ Iterator<E> iterator(); Interfacet Collection ärver interfacet Iterable: public interface Collection<E> extends Iterable<E> Alla klasser som implementerar Collection måste alltså implementera metoden iterator(). PFK (Seminarium 2 JCF) HT 2015 17 / 35 Interfacet Iterator<E> PFK (Seminarium 2 JCF) HT 2015 18 / 35 JCF interface hierarki med Iterable<E> och Iterator<E> En instans av en klass som implementerar interfacet Iterator används för att iterera över alla element i en samling. Iterable iterator() public interface Iterator<E> { /** Returns true if the iteration has more elements. */ boolean hasnext(); Collection Iterator Map /** Returns the next element in the iteration. */ E next(); /** Removes from the underlying collection the last element returned by the iterator (optional). */ void remove(); Queue List Set hasnext() next() remove() SortedMap SortedSet PFK (Seminarium 2 JCF) HT 2015 19 / 35 PFK (Seminarium 2 JCF) HT 2015 20 / 35

Användning av iterator Exempel Implementering av interfacet Iterator<E> Exempel: Klassen ArrayIterator ArrayList<Person> plist = new ArrayList<Person>(); // här sätts Person-objekt in i samlingen Iterator<Person> itr = plist.iterator(); while (itr.hasnext()) { Person p = itr.next(); // behandla p Lägg märke till hur man skaffar sig en iterator genom att anropa metoden iterator. private class ArrayIterator implements Iterator<E> { private int pos; private ArrayIterator() { pos = 0; public boolean hasnext() { return pos < size; PFK (Seminarium 2 JCF) HT 2015 21 / 35 Implementering av interfacet Iterator<E> Exempel: Klassen ArrayIterator, forts PFK (Seminarium 2 JCF) HT 2015 22 / 35 Implementering av interfacet Iterator<E> Inre klass public E next() { if (hasnext()) { E item = thecollection[pos]; pos++; return item; else { throw new NoSuchElementException(); public void remove() { throw new UnsupportedOperationException(); Den klass som implementerar interfacet Iterator kan vara inre klass i den klass som representerar samlingen. En inre klass har tillgång till alla attribut i den omgivande klassen det utnyttjas t.ex. i operationen next. Den kan vara privat, och ha en en privat konstruktor, eftersom det bara är den omgivande klassen som skapar instanser. Metoderna hasnext, måste däremot vara publika eftersom interfacet Iterator föreskriver detta. PFK (Seminarium 2 JCF) HT 2015 23 / 35 PFK (Seminarium 2 JCF) HT 2015 24 / 35

Implementering av interfacet Iterator<E> Kommentar foreach-sats i Java Exempel Implementeringen som visats här är förenklad: Iteratorer har enligt sitt kontrakt inte till uppgift att klara av att samlingen modifieras mellan anrop av next(). En korrekt iterator-implementering måste upptäcka detta och generera en exception om samlingen modifieras. ArrayList<Person> plist = new ArrayList<Person>(); // här sätts Person-objekt in samlingen for (Person p : plist) { // behandla p Ett sätt att enkelt iterera över samlingar. Man slipper att explicit använda en iterator. for (Person p : plist) kan läsas som för varje p i plist. Kan användas för objekt av klasser som implementerar Iterable och för vektorer. PFK (Seminarium 2 JCF) HT 2015 25 / 35 foreach-sats Vektorer Kan också användas för att iterera över elementen i en vektor. Ex: En metod som skriver ut namn på personer som lagrats i en vektor av typ Person[]: public void print(person[] a) { for (Person p : a) { System.out.println(p.getName()); PFK (Seminarium 2 JCF) HT 2015 26 / 35 Iterator foreach-sats Övning Övning Antag att vi har följande lista: LinkedList<Integer> list = new LinkedList<Integer>(); list.add(25); list.add(42); Summera talen i list genom att använda iterator() resp. foreach-sats. PFK (Seminarium 2 JCF) HT 2015 27 / 35 PFK (Seminarium 2 JCF) HT 2015 28 / 35

foreach-sats Begränsningar Foreach-sats kan inte användas när man explicit behöver tillgång till iteratorn i koden. Exempel: Tag bort alla personer som matchar x ur en ArrayList<Person> plist: Iterator<Person> itr = plist.iterator(); while (itr.hasnext()) { if (itr.next().equals(x)) { itr.remove(); Här behövs iteratorn för att kunna ta bort element. Söka efter objekt i en lista Följande klass beskriver en person: public class Person { private String name; private int idnbr; public Person (String name, int idnbr) { this.name = name; this.idnbr = idnbr; Vad skrivs ut när följande rader exekveras? ArrayList<Person> list = new ArrayList<Person>(); list.add(new Person("Kalle", 1)); list.add(new Person("Kajsa", 2)); System.out.println(list.contains(new Person("Kalle", 1))); PFK (Seminarium 2 JCF) HT 2015 29 / 35 Omdefiniera equals med instanceof PFK (Seminarium 2 JCF) HT 2015 30 / 35 Interfacet Comparable Specifikation public boolean equals(object obj) { if (obj instanceof Person) { return idnbr == ((Person) obj).idnbr; else { return false; Observera att parametern till equals måste vara av typ Object, annars blir det inte skuggning. Därför måste också typomvandling till Person ske när man ska använda obj:s idnbr. Uttrycket obj instanceof Person returnerar true om obj:s typ är Person eller någon subklass till Person. Uttrycket obj instanceof Person returnerar false om obj har värdet null. I Java finns ett generiskt interface, Comparable<T>: public interface Comparable<T> { /** * Compares this object with the specified object for order. * Returns a negative integer, zero, or a positive integer as * this object is less than, equal to, or greater than the * specified object. */ public int compareto(t x); Objekt av klasser som implementerar detta interface går att jämföra med varandra och kan t.ex. sorteras. PFK (Seminarium 2 JCF) HT 2015 31 / 35 PFK (Seminarium 2 JCF) HT 2015 32 / 35

Implementering av interfacet Comparable Exempel Jämföra likhet Metoderna compareto och equals public class Person implements Comparable<Person> { private String name; private int idnbr; public int compareto(person x) { return idnbr - x.idnbr; public boolean equals(object obj) { if (obj instanceof Person) { return compareto((person) obj) == 0; else { return false; Interfacet Comparable innehåller bara metoden compareto. Men för klasser som implementerar interfacet Comparable finns det två sätt att jämföra avseende likhet: Person p1 = ; Person p2 = ; if (p1.compareto(p2) == 0) { if (p1.equals(p2)) { Båda sätten att jämföra ska ge konsistenta resultat. Därför bör metoden equals omdefinieras i klasser som implementerar Comparable. PFK (Seminarium 2 JCF) HT 2015 33 / 35 Implementering av interfacet Comparable Övning PFK (Seminarium 2 JCF) HT 2015 34 / 35 Övning Ändra klassen Person så att den implementerar interfacet Comparable. Jämförelsen av Person-objekt ska göras med avseende på namnet. public class Person { private String name; private int idnbr; PFK (Seminarium 2 JCF) HT 2015 35 / 35